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
有数据,而另一个没有数据。我不希望包括这样的行。例如,如果on
Date
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