在python中创建新 Dataframe 的复杂多重转换

jjhzyzn0  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(222)

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

location1    date1   type1   value1  positions   location2   type2   date2   value2  
   sel1         Q1.22   lap1    10      50          sel1         fr1    Q1.22   10  
   sel1         Q1.22   d1      20      50          NaN          NaN    NaN     NaN 
   sel1         Q1.22   d2      10      50          NaN          NaN    NaN     NaN 
   vel1         Q1.22   a1      5       100         NaN          NaN    NaN     NaN 
   vel1         Q1.22   a2      5       100         NaN          NaN    NaN     NaN 
   vel1         Q2.22   v1      1       100         NaN          NaN    NaN     NaN 
   vel1         Q2.22   v1      1       100         NaN          NaN    NaN     NaN 
   tel1         Q3.22   b1      35      5           tel1         d1     Q3.22   2   
   tel1         Q3.22   b2      35      5           NaN          NaN    NaN     NaN 
   gel1         Q4.22   y1      10      80          gel1         z1     Q4.22   2   
   gel1         Q4.22   y2      15      80          gel1         z1     Q4.22   2

渴望的

location    date    consumed    retro   finalconsumed   re_space    positions   
sel1        Q1.22   40          10      30              48          50  
vel1        Q1.22   10          0       10              98          100 
vel1        Q2.22   2           0       2               96          100 
tel1        Q3.22   70          2       68              4           5   
gel1        Q4.22   25          4       21              80          80


我尝试按位置1和日期1分组,然后按合计值1创建“已消费”列,然后按合计值2创建“追溯”列(按位置2和日期2分组)
我还试图创建一个“final”列,然后从新创建的“retro”列中减去新创建的“consumered”
最后,我尝试按位置、位置1和日期1进行分组,从位置中减去类型1的计数,再加上类型2的计数。这是“re_space”列
对于“sel1”,有3个计数的“type1”和1个计数的“type2”(确保其按位置和日期分组)
对于“vel1”(q1.22),有2个“type1”计数,0个“type2”计数
对于“vel1”(q2.22),有2个“type1”计数,“type2”计数为0
步骤3示例
等级1,q1.22(100-2)+0=98
在q1.22中,vel1有100个位置,然后删除2并添加0(因为类型2是nan)
等级1,q2.22(98-2)+0=96
现在我们在vel1中有98个位置,因为我们已经从之前的数据中减去了2。98-2等于96
从98开始,因为这是我们职位的新起始编号
第三步是减法和加法

def f(x):
              d = {'consumed': [x['value1'].sum()],
                   'retro': [x['value2'].sum()],
                   'finalconsumed': [x['value1'].sum() - x['value2'].sum()],
                   're_space': [x['positions'].mean() - x['type1'].count() + x['type2'].count()]}
              return pd.DataFrame(d)

          u=df.groupby(['location1', 'date1']).apply(f).reset_index()

一位so成员最初帮助我完成了这项工作,它工作得非常漂亮。此后,我进行了更新,更新涉及从基本位置减去计数,以便每个季度使用正确的位置计数进行更新。我想我可能需要引入一个.累计计数脚本

.cumsum())

如有任何建议,我们将不胜感激。我还在研究。

xwbd5t1u

xwbd5t1u1#

在功能上做一个小改动:

def f(x):
    d = {'consumed': [x['value1'].sum()],
         'retro': [x['value2'].sum()],
         'finalconsumed': [x['value1'].sum() - x['value2'].sum()],
         're_space': [x['type2'].count() - x['type1'].count()]}  # <<< HERE
    return pd.DataFrame(d)

out = df.groupby(['location1', 'date1', 'positions']) \
        .apply(f).reset_index().drop(columns='level_3')

# Compute re_space with cumsum

out['re_space'] = out['positions'] + out.groupby('location1')['re_space'].cumsum()
>>> out
  location1  date1  positions  consumed  retro  finalconsumed  re_space
0      gel1  Q4.22         80        25    4.0           21.0        80
1      sel1  Q1.22         50        40   10.0           30.0        48
2      tel1  Q3.22          5        70    2.0           68.0         4
3      vel1  Q1.22        100        10    0.0           10.0        98
4      vel1  Q2.22        100         2    0.0            2.0        96

相关问题