使用 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 加载了dfchunksize=1,考虑到值将在不同的块中,我将如何获得类似的结果?实际上,chunksize10000,因此问题仅限于每个块的第一个和最后一个值。

【问题讨论】:

【参考方案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系列中的先前值和下一个值

在 Pandas 中将两列与 NaN 进行比较并获得差异

pandas 比较两个不同大小的数据帧映射值,并在缺失值时添加任意值

如何比较多列,并在单个新列中生成值,在 Pandas 中使用 Apply 函数

熊猫,比较不同长度的数据帧的值*范围*并写回原始 df

动态比较 n 多个 Pandas 列的值