使用 pandas 比较不同块中的值
Posted
技术标签:
【中文标题】使用 pandas 比较不同块中的值【英文标题】:compare values in different chunks using pandas 【发布时间】:2020-08-26 06:48:55 【问题描述】:假设我在内存中有一个大文件,在 pandas 中使用 chunksize
加载。现在我必须将每个值与与之相邻的值进行比较。我的问题是我似乎无法同时选择两个不同块的极值(在第一个和最后一个位置)。
示例:
print(df)
a
0 102
1 101
2 104
3 110
4 104
5 105
count = 0
for i in range(len(df)-1):
if df.iloc[i+1]['a']>df.iloc[i]['a']:
count+=1
count
在此示例中将等于 3
。但是假设我已经从.csv
加载了df
和chunksize=1
,考虑到值将在不同的块中,我将如何获得类似的结果?实际上,chunksize
是 10000
,因此问题仅限于每个块的第一个和最后一个值。
【问题讨论】:
【参考方案1】:编辑:
这是一个示例,我存储last_chunk_value
以在运行下一个循环时更新值。
我已经测试了一种“蛮力”方法来与“块脚本”进行比较。两种方法的结果相同。
顺便说一句,我已经简化了“蛮力”方法。
import pandas as pd
import numpy as np
import random
# 'data' generation as csv file
file = open("data.csv", 'w')
file.write('rand_int' + '\n')
for i in range(0, 10000):
file.write(str(random.randint(80,120)) + '\n')
file.close()
# "brute force method"
df = pd.read_csv("data.csv")
length = int( (df.shift(-1) - df > 0).sum() )
print('number=', length)
# chunksize method
chunksize = 33
length = 0
last_chunk_value = np.nan
for chunk in pd.read_csv("data.csv", chunksize=chunksize):
chunk['shift'] = chunk.shift(1)
chunk.iloc[0, 1] = last_chunk_value
length += (chunk['rand_int'] - chunk['shift'] > 0).sum()
last_chunk_value = chunk.iloc[-1, 0]
print('number=', length)
【讨论】:
对不起,但我认为您错过了问题的重点:如果“相邻”值存储在不同的块中,如何访问它们。 好的,我已经编辑了我的第一个代码来回答您的问题。问候!以上是关于使用 pandas 比较不同块中的值的主要内容,如果未能解决你的问题,请参考以下文章
pandas 比较两个不同大小的数据帧映射值,并在缺失值时添加任意值