在大部分操作pandas可以与运营商链接(来完成groupby,aggregate,apply,等),但我发现过滤行的唯一方法是通过正常的托架索引
df_filtered = df[df['column'] == value]
Run Code Online (Sandbox Code Playgroud)
这是没有吸引力的,因为它需要df在能够过滤其值之前分配给变量.有更像以下的东西吗?
df_filtered = df.mask(lambda x: x['column'] == value)
Run Code Online (Sandbox Code Playgroud) 我有一个大文件(19GB左右),我想在内存中加载以执行某些列的聚合.
该文件如下所示:
id, col1, col2, col3,
1 , 12 , 15 , 13
2 , 18 , 15 , 13
3 , 14 , 15 , 13
3 , 14 , 185 , 213
Run Code Online (Sandbox Code Playgroud)
请注意,我在加载到数据框后使用列(id,col1)进行聚合,还要注意这些键可能会连续重复几次,例如:
3 , 14 , 15 , 13
3 , 14 , 185 , 213
Run Code Online (Sandbox Code Playgroud)
对于小文件,以下脚本可以完成此任务
import pandas as pd
data = pd.read_csv("data_file", delimiter=",")
data = data.reset_index(drop=True).groupby(["id","col1"], as_index=False).sum()
Run Code Online (Sandbox Code Playgroud)
但是,对于大文件,我需要在读取csv文件时使用chunksize来限制加载到内存中的行数:
import pandas as pd
data = pd.read_csv("data_file", delimiter=",", chunksize=1000000)
data = data.reset_index(drop=True).groupby(["id","col1"], as_index=False).sum()
Run Code Online (Sandbox Code Playgroud)
在后一种情况下,如果(id,col1)相似的行被分成不同的文件,则会出现问题.我该怎么处理?
编辑
正如@EdChum所指出的,有一个潜在的解决方法,即不仅将groupby结果附加到新的csv并重新读取并再次执行聚合,直到df大小不变. …
我知道 skiprows 允许您传递包含要跳过的行索引的列表。但是,我有要保留的行的索引。
假设我的 cvs 文件在数百万行中看起来像这样:
A B
0 1 2
1 3 4
2 5 6
3 7 8
4 9 0
Run Code Online (Sandbox Code Playgroud)
我想加载的索引列表只有 2,3,所以
index_list = [2,3]
Run Code Online (Sandbox Code Playgroud)
skiprows 函数的输入是 [0,1,4]。但是,我只有 [2,3] 可用。
我正在尝试类似的东西:
pd.read_csv(path, skiprows = ~index_list)
Run Code Online (Sandbox Code Playgroud)
但没有运气..有什么建议吗?
谢谢,我感谢所有的帮助,
我正在使用这个答案来了解如何使用pandas.
使用的建议pd.read_csv('./input/test.csv' , iterator=True, chunksize=1000)效果很好,但它返回一个<class 'pandas.io.parsers.TextFileReader'>,所以我将其转换为数据帧,pd.concat(pd.read_csv('./input/test.csv' , iterator=True, chunksize=25))但这需要与首先读取文件一样多的时间!
关于如何快速读取文件的一部分有什么建议吗?