我无法弄清楚Pandas .aggregate和.apply功能之间的区别.
以下面的例子为例:我加载一个数据集,做一个groupby,定义一个简单的函数,以及用户.agg或.apply.
正如您所看到的,使用.agg和后,我的函数中的打印语句会产生相同的输出.apply.结果,另一方面是不同的.这是为什么?
import pandas
import pandas as pd
iris = pd.read_csv('iris.csv')
by_species = iris.groupby('Species')
def f(x):
...: print type(x)
...: print x.head(3)
...: return 1
Run Code Online (Sandbox Code Playgroud)
使用apply:
by_species.apply(f)
#<class 'pandas.core.frame.DataFrame'>
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#0 5.1 3.5 1.4 0.2 setosa
#1 4.9 3.0 1.4 0.2 setosa
#2 4.7 3.2 1.3 0.2 setosa
#<class 'pandas.core.frame.DataFrame'>
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#0 5.1 …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大小不变. …
df = df.groupby(df.index).sum()
我有一个包含380万行(单列)的数据框,并且我试图按索引对它们进行分组。但是,它需要永远完成计算。是否有其他方法可以处理非常大的数据集?提前致谢!!!!
我正在用Python编写。
数据如下所示。索引是客户ID。我想组qty_liter通过Index。
df = df.groupby(df.index).sum()
但是这一行代码花了太多时间.....
有关此df的信息如下:
df.info()
<class 'pandas.core.frame.DataFrame'>
Index: 3842595 entries, -2147153165 to \N
Data columns (total 1 columns):
qty_liter object
dtypes: object(1)
memory usage: 58.6+ MB
如果我只是传递一个函数,那么DataFrame.aggregate()和DataFrame.apply()函数之间的返回值的(类型)有什么不同吗?
func=lambda x: x**2
Run Code Online (Sandbox Code Playgroud)
因为返回值似乎非常相似.文档只告诉:
apply() - > applied:Series或DataFrame
aggregate() - > aggregated:DataFrame
更新:
pandas df是这样创建的:
df = pd.read_sql(query, engine)
encoded = pd.get_dummies(df, columns=['account'])
Run Code Online (Sandbox Code Playgroud)
从此df创建一个dask df如下所示:
df = dd.from_pandas(encoded, 50)
Run Code Online (Sandbox Code Playgroud)
轻而易举地执行操作不会导致可见的进度(使用轻便的诊断程序进行检查):
result = df.groupby('journal_entry').max().reset_index().compute()
Run Code Online (Sandbox Code Playgroud)
原版的:
我有一个具有270万行和4,000列的大熊猫df。除四列外,所有列均为dtype uint8。uint8列仅保留值1或0。我试图在df上执行此操作:
result = df.groupby('id').max().reset_index()
Run Code Online (Sandbox Code Playgroud)
可以预期,此操作将立即返回内存错误。我最初的想法是在水平和垂直方向上对df进行分块。但是,这会造成混乱,因为.max()需要跨所有uint8列(而不仅仅是一对列)执行该操作。此外,像这样对df进行分块仍然非常慢。我的机器上有32 GB的RAM。
哪种策略可以减轻内存问题?