【问题标题】:How to aggregate dataframe into a row如何将数据框聚合成一行
【发布时间】:2022-01-11 14:18:05
【问题描述】:

给定两个数据框df_1df_2,如何将df_2 的值聚合到df_1 的行中,使得df_1 中的date 介于opendf_2 中的close 之间

print df_1

  date          A          B
0 2021-11-01    0.020228   0.026572
1 2021-11-02    0.057780   0.175499
2 2021-11-03    0.098808   0.620986
3 2021-11-04    0.158789   1.014819
4 2021-11-05    0.038129   2.384590


print df_2

  open        close       location     division     size    
0 2021-11-07  2021-11-14  LDN          Alpha        120
1 2021-11-01  2021-11-14  PRS          Alpha        450
2 2021-10-14  2021-11-27  HK           Beta         340

我已经尝试使用 solution 加入我的数据框,现在我需要找到一种聚合方法。 到目前为止我所做的是:

df_2.index = pd.IntervalIndex.from_arrays(df_2['open'],df_2['close'],closed='both')
df_1['events'] = df_1['date'].apply(lambda x : df_2.iloc[df_2.index.get_loc(x)])


print(calls['code'].iloc[0].groupby(['location', 'division'])['size'].sum())

location  division              
LDN       Alpha                     421.0
LDN       Beta                      515.0
NY        Alpha                     369.0
PRQ       Alpha                     132.0
          Gamma                     110.0

我需要这样的东西:

  date          A          B          LDN_Alpha   LDN_Beta   LDN_Gamma   PRS_Alpha   ...
0 2021-11-01    0.020228   0.026572   120         300        0           530
1 2021-11-02    0.057780   0.175499   ...
2 2021-11-03    0.098808   0.620986
3 2021-11-04    0.158789   1.014819
4 2021-11-05    0.038129   2.384590

其中创建的列是由locationdivision 分组的size 的总和

【问题讨论】:

  • 转置然后 agg 怎么样?
  • 我认为我们需要更多的转置,首先我们需要一种聚合方式(鉴于在列事件中我们有一个完整的数据框;目前我们没有解决方案聚合它)显示的只是单个单元格上的聚合 .iloc [0] 你能放下一个我理解你的逻辑的代码 sn-p,谢谢

标签: python pandas dataframe pandas-groupby


【解决方案1】:

想法是首先通过openclose 列重复日期范围,从df_2 添加原始列,然后使用DataFrame.pivot_tableDataFrame.join

df_1['date'] = pd.to_datetime(df_1['date'])

s=pd.concat([pd.Series(r.Index,pd.date_range(r.open, r.close)) for r in df_2.itertuples()])
df = df_2.join(pd.Series(s.index, s).rename('date'))

df = df.pivot_table(index='date', 
                    columns=['location', 'division'], 
                    values='size', 
                    aggfunc='sum', 
                    fill_value=0)
df.columns = df.columns.map(lambda x: f'{x[0]}_{x[1]}')

df = df_1.join(df, on='date')
print (df)
        date         A         B  HK_Beta  LDN_Alpha  PRS_Alpha
0 2021-11-01  0.020228  0.026572      340          0        450
1 2021-11-02  0.057780  0.175499      340          0        450
2 2021-11-03  0.098808  0.620986      340          0        450
3 2021-11-04  0.158789  1.014819      340          0        450
4 2021-11-05  0.038129  2.384590      340          0        450

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 2017-03-26
    • 2018-09-23
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多