在python中将列从一个数据帧添加到分组数据帧

Posted

技术标签:

【中文标题】在python中将列从一个数据帧添加到分组数据帧【英文标题】:Add column from one data frame to group-by data frame in python 【发布时间】:2017-05-19 04:23:33 【问题描述】:

我在 python 中有两个数据框。第一个是一年中某一天的原始降雨量数据,第二个是使用group.by 的每日降雨量总和。

一个数据框看起来像这样(在 device_id 之间有更多的行):

>>> df1
                             device_id      rain  day  month  year
0     9z849362-b05d-4317-96f5-f267c1adf8d6   0.0   31     12  2016
1     9z849362-b05d-4317-96f5-f267c1adf8d6   0.0   31     12  2016
6     e7z581f0-2693-42ad-9896-0048550ccda7   0.0   31     12  2016
11    e7z581f0-2693-42ad-9896-0048550ccda7   0.0   31     12  2016
12    ceez972b-135f-45b3-be4w-7c23102676bq   0.2   31     12  2016
13    ceez972b-135f-45b3-be4w-7c23102676bq   0.0   31     12  2016
18    ceez972b-135f-45b3-be4w-7c23102676bq   0.0   31     12  2016
19    1d28dz3a-c923-4967-a7bb-5881d232c9a7   0.0   31     12  2016
24    1d28dz3a-c923-4967-a7bb-5881d232c9a7   0.0   31     12  2016
25    a044ag4f-fd7c-4ae4-bff3-9158cebad3b1   0.0   31     12  2016
29    a044ag4f-fd7c-4ae4-bff3-9158cebad3b1   0.0   31     12  2016
29    a044ag4f-fd7c-4ae4-bff3-9158cebad3b1   0.0   31     12  2016
...                                    ...   ...  ...    ...   ...
3903  9z849362-b05d-4317-96f5-f267c1adf8d6   0.0   31     12  2016
3904  9z849362-b05d-4317-96f5-f267c1adf8d6   0.0   31     12  2016
3905  9z849362-b05d-4317-96f5-f267c1adf8d6   0.0   31     12  2016

另一个看起来像这样:

>>> df2
                                      rain
device_id
1d28dz3a-c923-4967-a7bb-5881d232c9a7   0.0
9z849362-b05d-4317-96f5-f267c1adf8d6   0.0
a044ag4f-fd7c-4ae4-bff3-9158cebad3b1   1.2
ceez972b-135f-45b3-be4w-7c23102676bq   2.2
e7z581f0-2693-42ad-9896-0048550ccda7   0.2

...我通过使用得到的:

df2 = df1.groupby(['device_id'])[["rain"]].sum()

我希望我的最终数据框如下所示:

>>> df3
                                  rain      day  month  year
device_id
1d28dz3a-c923-4967-a7bb-5881d232c9a7   0.0  31   12     2016
9z849362-b05d-4317-96f5-f267c1adf8d6   0.0  31   12     2016
a044ag4f-fd7c-4ae4-bff3-9158cebad3b1   1.2  31   12     2016
ceez972b-135f-45b3-be4w-7c23102676bq   2.2  31   12     2016 
e7z581f0-2693-42ad-9896-0048550ccda7   0.2  31   12     2016

也就是说,我希望将df1 中的“日月年”列添加到df2。我不确定我应该使用mergeappend,还是做其他事情。

【问题讨论】:

【参考方案1】:

也许这会起作用?也可以按天按月和按年分组。

df.groupby(['device_id', 'day', 'month', 'year']).sum()
                                                     rain
device_id                            day month year      
1d28dz3a-c923-4967-a7bb-5881d232c9a7 31  12    2016   0.0
9z849362-b05d-4317-96f5-f267c1adf8d6 31  12    2016   0.0
a044ag4f-fd7c-4ae4-bff3-9158cebad3b1 31  12    2016   0.0
ceez972b-135f-45b3-be4w-7c23102676bq 31  12    2016   0.2
e7z581f0-2693-42ad-9896-0048550ccda7 31  12    2016   0.0

或者您可以添加 reset_index 以将这些列返回到 DataFrame,例如

df.groupby(['device_id', 'day', 'month', 'year']).sum().reset_index()

0  1d28dz3a-c923-4967-a7bb-5881d232c9a7   31     12  2016   0.0
1  9z849362-b05d-4317-96f5-f267c1adf8d6   31     12  2016   0.0
2  a044ag4f-fd7c-4ae4-bff3-9158cebad3b1   31     12  2016   0.0
3  ceez972b-135f-45b3-be4w-7c23102676bq   31     12  2016   0.2
4  e7z581f0-2693-42ad-9896-0048550ccda7   31     12  2016   0.0

或者以下应该完全匹配您的索引/列结构。

df.groupby(['device_id', 'day', 'month', 'year']).sum().reset_index([1, 2, 3])

【讨论】:

这应该可以解决问题!你也可以使用 "as_index=False" 代替 od "reset_index()": df.groupby(['device_id', 'day', 'month', 'year'], as_index=False).sum() 啊,是的,as_index=False。我两周前用过,但忘记了。谢谢提醒。 感谢@lmo 和@MaxU!

以上是关于在python中将列从一个数据帧添加到分组数据帧的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 基于连接将列从一个数据帧添加到另一个数据帧

Apache Spark 如何将新列从列表/数组附加到 Spark 数据帧

添加滑块以绘制热图动画-python

根据来自不同数据帧的行名将列从另一个数据帧复制到

如何向 pandas df 添加一个新列,该列从另一个数据帧返回同一组中更大的最小值

根据几个条件将列从一个数据帧映射到另一个数据帧,以考虑存在的多个映射中的一个映射