如何在dask数据框中添加一列,以基于其他列中值的相似性包含一列的值的平均值

时间:2019-01-22 01:44:37

标签: python dataframe mean aggregation dask

我有一个很大的CSV文件,已将它作为Python数据框以Python格式导入。我做了一个小数据框来解释我的问题。

import dask.dataframe as dd
df = dd.read_csv("name and path of the file.csv")
df.head()

输出:

 +----+----+----+----+
 |col1|col2|col3|col4|
 +----+----+----+----+
 |  A |2001|  2 |  5 |
 +----+----+----+----+
 |  A |2001|  2 |  4 |
 +----+----+----+----+
 |  A |2001|  3 |  6 |
 +----+----+----+----+
 |  A |2002|  4 |  5 |
 +----+----+----+----+
 |  B |2001|  2 |  9 |
 +----+----+----+----+
 |  B |2001|  2 |  4 |
 +----+----+----+----+
 |  B |2001|  2 |  3 |
 +----+----+----+----+
 |  B |2001|  3 | 95 |
 +----+----+----+----+

如果col3_mean中的对应值相同,我想添加另一列col3,其中包含col1的平均值。

 +----+----+----+----+---------+
 |col1|col2|col3|col4|col3_mean|
 +----+----+----+----+---------+
 |  A |2001|  2 |  5 |   2.75  |
 +----+----+----+----+---------+
 |  A |2001|  2 |  4 |   2.75  |
 +----+----+----+----+---------+
 |  A |2001|  3 |  6 |   2.75  |
 +----+----+----+----+---------+
 |  A |2002|  4 |  5 |   2.75  |
 +----+----+----+----+---------+
 |  B |2001|  2 |  9 |   2.25  |
 +----+----+----+----+---------+
 |  B |2001|  2 |  4 |   2.25  |
 +----+----+----+----+---------+
 |  B |2001|  2 |  3 |   2.25  |
 +----+----+----+----+---------+
 |  B |2001|  3 | 95 |   2.25  |
 +----+----+----+----+---------+

我知道在pandas中可以完成此任务,我们可以使用:

df['col3_mean'] = df.groupby(['col1'])['col3'].transform('mean')

我在dask中使用了以下代码,但它为Nan返回了col3_mean的值

df['col3_mean'] = df.groupby(df.col1).col3.mean()

我还使用了df['index'] = df.groupby(df.lable).col3.mean().collect(),它不起作用。另外,以下行仅返回pandas.core.series.Series

df.groupby(df.col1).col3.mean().collect()

2 个答案:

答案 0 :(得分:1)

发布问题后,我可以找出答案:

s = df.groupby(df.col1).col3.mean().compute()
#s is pandas series
df['col3_mean'] = df['col1'].map(s)

但是,它不适用于我的大型数据框。它永远运行,我必须重新启动计算机。

请告诉我您是否还有其他解决方法

答案 1 :(得分:0)

以下代码适用于我的大数据

agg = df.groupby(['lable']).open_cap.aggregate(["mean"])
agg.columns = ['col3_mean']
df = df.merge(agg.reset_index(), on="lable", how="left")

如果有任何问题,也请添加您对此问题的答案。