【问题标题】:Perform calculations and new dataframe from original dataframe从原始数据帧执行计算和新数据帧
【发布时间】:2021-07-10 17:43:22
【问题描述】:

我有一个大数据框 df,我想在其中执行计算并从中创建新字段。

数据

l_re date_re val_re id_re    u_re pos_re  l_d date_d val_d  id_d      u_d
c    q321   10      c_q321_1  ok   160    c   q321   20    c_q321_1   hi
c    q321   20      c_q321_2  cool 160    c   q321   10    c_q321_2   hi
b    q321   5       b_q321_1  sure 50     NaN NaN    NaN   NaN        NaN           
NaN  NaN    NaN     NaN       NaN  NaN    c   q422   5     c_q422_1   red
NaN NaN     NaN     NaN       NaN  NaN    c   q422   15    c_q422_2   blue

希望

lo  date    consumed    retro   final   space
c   q321    30          30      0       160
b   q321    5           0       5       49

正在做

  1. 我正在尝试按 l_re 和 date_re 分组,然后对 val_re 求和并创建一个“已消费”列,然后对 val_d 求和并创建一个“复古”列(按 l_d 和 date_d 分组)

  2. 我也在尝试创建一个“final”列,然后从新创建的“retro”列中减去新创建的“consumed”

  3. 最后我尝试按 pos_re、l_re 和 date_re 分组,并从 pos_re 中减去 id_re 的计数并添加 id_d 的计数.这是“空间”列

对于'c','id_re'有2个计数,'id_d'有2个计数

对于'b','id_re'有1个计数,'id_d'有0个计数

步骤 3 示例

(160 - 2) + 2 = 160

(50 - 1) + 0 = 49

      step1 = df.groupby(['l_re','date_re']).agg({'val_re': 'sum'})
      step2 = df['final'] = df['consumed'] - df['retro'].astype(int)


      step3 = df['space'] = df.groupby(['pos_re', 'l_re', 'date_re']).transform('sum')

              df['space'] = (df['pos_re'] - df['id_re'] + df['id_d'])

第 3 步涉及减法和加法

我能够单独执行一些转换,但不确定如何将所有步骤平滑地合并在一起。任何建议表示赞赏

【问题讨论】:

  • IIUC 在第 3 步中,您减去 pos_re 并消耗,然后再次添加它,那么什么是减法...我的意思是那为什么要减去?
  • 您添加的这些数字是从哪里来的?
  • @Anurag 160 和 50 来自 'pos_re' 列 C 组有 2 个 'id_re' 计数,b 组有 1 个 'id_d' 计数
  • 是的,我知道了,但我要求您添加 2 和 0 的加法部分,所以这些数字来自哪里?
  • 2 是 c 被 pos_re', 'l_re', 'date_re' 分组时的计数,另外 2 是 'l_d', 'date_d' 分组时的计数。 b 在对 pos_re'、'l_re'、'date_re' 进行分组时为 1,在对 'l_d'、'date_d' 进行分组时为 0,因为它具有 NaN 记录

标签: python pandas numpy


【解决方案1】:

IIUC:

def f(x):
    d = {'consumed': [x['val_re'].sum()],
         'retro': [x['val_d'].sum()],
         'final': [x['val_re'].sum() - x['val_d'].sum()],
         'space': [x['pos_re'].mean() - x['id_re'].count() + x['id_d'].count()]}
    return pd.DataFrame(d)
>>> df.groupby(['l_re', 'date_re']).apply(f).reset_index()
  l_re date_re  level_2  consumed  retro  final  space
0    b    q321        0       5.0    0.0    5.0   49.0
1    c    q321        0      30.0   30.0    0.0  160.0

【讨论】:

  • @Lynn。我不明白您为什么选择复杂的解决方案而不是简单的解决方案?
  • 是的,我现在确实看到这更简单了。您已经创建了一个函数,然后将该函数应用于第二行代码。我将不得不尝试我的完整数据集。第一个解决方案对两者都有效。我需要测试我的完整数据集,因为这肯定适用于提供的示例数据集。
  • 让我早上测试
  • 您的代码运行良好。我创建了一个与此类似的新帖子。如果可以的话,请你看看这个。我还在研究中
【解决方案2】:

第3步不清楚

s=df.groupby(['l_re','date_re']).agg(consumed =('val_re','sum'),retro =('val_d','sum')).reset_index()
s['final']=s['consumed'].sub(s['retro'])

【讨论】:

  • 好的,谢谢,这解决了前两个步骤
猜你喜欢
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 1970-01-01
  • 2020-10-11
  • 2022-09-23
  • 2015-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多