在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
。我不确定我应该使用merge
、append
,还是做其他事情。
【问题讨论】:
【参考方案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中将列从一个数据帧添加到分组数据帧的主要内容,如果未能解决你的问题,请参考以下文章
Apache Spark 如何将新列从列表/数组附加到 Spark 数据帧