繁体   English   中英

如何将表与 pandas 中的每组 dataframe 连接起来

[英]How to join a table with each group of a dataframe in pandas

我有一个 dataframe 如下所示。 每个日期是每周的星期一。

df = pd.DataFrame({'date' :['2020-04-20', '2020-05-11','2020-05-18',
                                 '2020-04-20', '2020-04-27','2020-05-04','2020-05-18'],
                         'name': ['A', 'A', 'A', 'B', 'B', 'B', 'B'], 
                          'count': [23, 44, 125, 6, 9, 10, 122]})

    date      name  count
0   2020-04-20  A   23
1   2020-05-11  A   44
2   2020-05-18  A   125
3   2020-04-20  B   6
4   2020-04-27  B   9
5   2020-05-04  B   10
6   2020-05-18  B   122

“A”和“B”都没有涵盖整个日期范围。 他们都缺少一些日期,这意味着该周的计数为 0。以下是所有日期:

df_dates = pd.DataFrame({ 'date':['2020-04-20', '2020-04-27','2020-05-04','2020-05-11','2020-05-18'] }) 

所以我需要的是像下面的dataframe:

    date      name  count
0   2020-04-20  A   23
1   2020-04-27  A   0
2   2020-05-04  A   0
3   2020-05-11  A   44
4   2020-05-18  A   125
5   2020-04-20  B   6
6   2020-04-27  B   9
7   2020-05-04  B   10
8   2020-05-11  B   0
9   2020-05-18  B   122

似乎我需要为每个名称组(A和B)加入(合并) df_datesdf ,然后用0填充缺少名称和缺少计数值的数据。 有谁知道做到这一点? 我如何加入另一个带有分组表的表?

我试过了,没有运气...

pd.merge(df_dates, df.groupby('name'), how='left', on='date')

我们可以通过创建多个索引来reindex索引

idx=pd.MultiIndex.from_product([df_dates.date,df.name.unique()],names=['date','name'])  
s=df.set_index(['date','name']).reindex(idx,fill_value=0).reset_index().sort_values('name')
Out[136]: 
         date name  count
0  2020-04-20    A     23
2  2020-04-27    A      0
4  2020-05-04    A      0
6  2020-05-11    A     44
8  2020-05-18    A    125
1  2020-04-20    B      6
3  2020-04-27    B      9
5  2020-05-04    B     10
7  2020-05-11    B      0
9  2020-05-18    B    122

或者

s=df.pivot(*df.columns).reindex(df_dates.date).fillna(0).reset_index().melt('date')
Out[145]: 
         date name  value
0  2020-04-20    A   23.0
1  2020-04-27    A    0.0
2  2020-05-04    A    0.0
3  2020-05-11    A   44.0
4  2020-05-18    A  125.0
5  2020-04-20    B    6.0
6  2020-04-27    B    9.0
7  2020-05-04    B   10.0
8  2020-05-11    B    0.0
9  2020-05-18    B  122.0

如果您正在寻找只需填写df中的日期并集,您可以执行以下操作:

(df.set_index(['date','name'])
   .unstack('date',fill_value=0)
   .stack().reset_index()
)

Output:

  name        date  count
0    A  2020-04-20     23
1    A  2020-04-27      0
2    A  2020-05-04      0
3    A  2020-05-11     44
4    A  2020-05-18    125
5    B  2020-04-20      6
6    B  2020-04-27      9
7    B  2020-05-04     10
8    B  2020-05-11      0
9    B  2020-05-18    122

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM