使用熊猫比较不同块中的值

时间:2020-05-10 19:33:11

标签: python python-3.x pandas dataframe large-data

说我的内存中有一个大文件,该文件是用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。但是,假设我从df的{​​{1}}加载了.csv,考虑到值将位于不同的块中,我将如何获得类似的结果?实际上,chunksize=1chunksize,因此问题将仅限于每个块的第一个和最后一个值。

1 个答案:

答案 0 :(得分:0)

编辑: 这是一个示例,其中我存储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)