【问题标题】:Create a new column based on previous row value and delete the current row根据前一行值创建一个新列并删除当前行
【发布时间】:2019-11-10 22:32:51
【问题描述】:

我有一个输入数据帧,可以从下面给出的代码生成

  df = pd.DataFrame({'subjectID' :[1,1,2,2],'keys': 
  ['H1Date','H1','H2Date','H2'],'Values': 
  ['10/30/2006',4,'8/21/2006',6.4]})

输入数据框如下所示

这就是我所做的

s1 = df.set_index('subjectID').stack().reset_index()

s1.rename(columns={0:'values'}, 
             inplace=True)
d1 = s1[s1['level_1'].str.contains('Date')]
d2 = s1[~s1['level_1'].str.contains('Date')]

d1['g'] = d1.groupby('subjectID').cumcount()
d2['g'] = d2.groupby('subjectID').cumcount()

d3 = pd.merge(d1,d2,on=["subjectID", 'g'],how='left').drop(['g','level_1_x','level_1_y'], axis=1)

虽然可行,但恐怕这可能不是最好的方法。因为我们可能有超过 200 列和 50k 记录。进一步改进我的代码的任何帮助都非常有帮助。

我希望我的输出数据框如下所示

【问题讨论】:

    标签: python python-3.x pandas dataframe for-loop


    【解决方案1】:

    可能是这样的:

    s=df.groupby(df['keys'].str.contains('Date').cumsum()).cumcount()+1
    

    final=(df.assign(s=s.astype(str)).set_index(['subjectID','s']).
           unstack().sort_values(by='s',axis=1))
    final.columns=final.columns.map(''.join)
    print(final)
    

               keys1     Values1 keys2 Values2
    subjectID                                  
    1          H1Date  10/30/2006    H1       4
    2          H2Date   8/21/2006    H2     6.4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 2019-07-06
      • 2023-03-15
      • 2021-04-29
      • 1970-01-01
      相关资源
      最近更新 更多