使用 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 比较不同块中的值的主要内容,如果未能解决你的问题,请参考以下文章

为啥在数组中的值的情况下比较的工作方式不同

在 s-s-rS 中,如何将父报表项的值与子组中的报表项进行比较?

breakcontinuereturn几个关键字的使用

比较数组中的值并删除 Ruby/Rails 中不同的项目

如何比较同一个表中的多行并用不同的值标记它们?

您如何比较多个表中的记录但查找不同或缺失的值