Python 通过组合不同的组创建新的数据帧
从上面的数据框中,我想创建一个新的数据框,其中相同的Python 通过组合不同的组创建新的数据帧,python,pandas,group-by,Python,Pandas,Group By,从上面的数据框中,我想创建一个新的数据框,其中相同的Date和不同的source的id位于同一行。e、 g.输出应如下所示: id source Date CVI 67092 10365 sat 2016-11-20 00:00:00 1.9 67093 10365 nel-2 2016-11-20 00:00:00 1.5 67094 10365 sat
Date
和不同的source
的id
位于同一行。e、 g.输出应如下所示:
id source Date CVI
67092 10365 sat 2016-11-20 00:00:00 1.9
67093 10365 nel-2 2016-11-20 00:00:00 1.5
67094 10365 sat 2016-12-06 00:00:00 1.436964
67095 10365 sat 2016-12-22 00:00:00 NaN
67096 10365 sat 2017-01-07 00:00:00 4.835949
67097 10365 sat 2017-01-23 00:00:00 10.033607
... ... ... ... ...
723 84650 nel-2 2020-04-03 00:00:00 5.085851
724 84650 nel-2 2020-04-08 00:00:00 4.375207
725 84650 nel-2 2020-04-13 00:00:00 0.040688
726 84650 nel-2 2020-04-18 00:00:00 3.151000
我尝试使用groupby,但它不能满足我的需要。请注意,如果没有重复的三元组
id
,则生成的表中只有相同id
的CVI
值对于源
和日期
相同的行,Date
和source
值与一起用于重塑列名,然后通过以下方式更改列名删除缺少值的行:
如果可能重复,则第一个解决方案失败是必要的(它也适用于无重复的三元组,然后是无聚合),具有一些聚合功能,如sum
,mean
,而不是使用取消堆栈设置索引
:
df1 = (df.set_index(['id','Date','source'])['CVI']
.unstack()
.add_suffix('_CVI')
.dropna()
.reset_index()
.rename_axis(None, axis=1))
print (df1)
id Date nel-2_CVI sat_CVI
0 10365 2016-11-20 00:00:00 1.5 1.9
打印(df)
id来源日期CVI
67092 10365 sat 2016-11-20 00:00:00 1.900000@jezrael,这与仅使用透视表不同,因为我只希望相同的id的两个源都有相同的日期
的行
对不起,不明白,可以创建吗?因为输出中的1.5
不在输入数据框架中,谢谢@jezrael,所以我将示例更新为MCVEit is close,但它似乎包含带有Date
的偶数行,其中一个source
有数据,而另一个没有数据。我不希望包括这样的行。例如,如果onDate
2020-04-03 00:00:00
只有nel-2
在CVI
列中有数据,则该行不应包含在outputhmm中,因此df.pivot_表(索引=['id','Date columns='source',values='CVI')。需要什么?
df1 = (df.set_index(['id','Date','source'])['CVI']
.unstack()
.add_suffix('_CVI')
.dropna()
.reset_index()
.rename_axis(None, axis=1))
print (df1)
id Date nel-2_CVI sat_CVI
0 10365 2016-11-20 00:00:00 1.5 1.9
print (df)
id source Date CVI
67092 10365 sat 2016-11-20 00:00:00 1.900000 <- duplicated triple
67092 10365 sat 2016-11-20 00:00:00 1.000000 <- duplicated triple
67093 10365 nel-2 2016-11-20 00:00:00 1.500000
67094 10365 sat 2016-12-06 00:00:00 1.436964
67095 10365 sat 2016-12-22 00:00:00 NaN
67096 10365 sat 2017-01-07 00:00:00 4.835949
67097 10365 sat 2017-01-23 00:00:00 10.033607
723 84650 nel-2 2020-04-03 00:00:00 5.085851
724 84650 nel-2 2020-04-08 00:00:00 4.375207
725 84650 nel-2 2020-04-13 00:00:00 0.040688
726 84650 nel-2 2020-04-18 00:00:00 3.151000
df1 = (df.pivot_table(index=['id','Date'],columns='source', values='CVI', aggfunc='sum')
.add_suffix('_CVI')
.dropna()
.reset_index()
.rename_axis(None, axis=1))
print (df1)
id Date nel-2_CVI sat_CVI
0 10365 2016-11-20 00:00:00 1.5 2.9