首页 > 解决方案 > 在 pandas 中创建新列以存储单独的值

问题描述

ID    onevalue  twovalue 
ABC   0.568      0.004
ABC   5.620     -2.514
ABC   -1.551    -0.452
LMN   14.56      7.456  
LMN   6.750      2.896         
LMN   5.620      1.166                   
LMN   8.640      3.486   

基于上面的数据框,我有以下功能:

cond = (df.onevalue > df.twovalue)
df['S'] = np.where(cond, df.onevalue,"")

这很好用,并在新的“S”数据框/系列上为我提供了适当的“单值”。

我现在要做的是我希望它创建多个“S”列,并为给定的“ID”在每列中放置一个“onevalue”变量。出现新 ID 后,列生成应该重新开始,并且重复的值不应该计算在内。为了澄清起见,这是一个预期的结果:

ID    onevalue  twovalue    S      S1     S2
ABC   0.568      0.004    0.568
ABC   5.620     -2.514          5.620 
ABC   -1.551    -0.452
LMN   14.56      7.456    14.56
LMN   6.750      2.896          6.750
LMN   5.620      1.166                   
LMN   8.640      3.486                  8.640

不确定 pandas 是否允许未定义的列创建,如果是这种情况,我们可以假设每个 ID 最多 7 列。

我一直在努力解决它,但没有运气。一点帮助将不胜感激。

谢谢!

标签: pythonpandasnumpydataframe

解决方案


ID是的,您可以在和 unstack中枚举具有相对顺序的行:

df.join(pd.DataFrame({'S':np.maximum(df.onevalue, df.twovalue),
              'idx': df.groupby('ID').cumcount()})
   .set_index('idx',append=True)['S']
   .unstack('idx').fillna('').add_prefix('S')
)

输出:

    ID  onevalue  twovalue     S0    S1     S2    S3
0  ABC     0.568     0.004  0.568                   
1  ABC     5.620    -2.514         5.62             
2  ABC    -1.551    -0.452              -0.452      
3  LMN    14.560     7.456  14.56                   
4  LMN     6.750     2.896         6.75             
5  LMN     5.620     1.166                5.62      
6  LMN     8.640     3.486                      8.64

推荐阅读