python - 根据前一行值创建一个新列并删除当前行
问题描述
我有一个输入数据框,可以从下面给出的代码生成
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 记录。进一步改进我的代码的任何帮助都非常有帮助。
我希望我的输出数据框如下所示
解决方案
可能是这样的:
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
推荐阅读
- apache-spark - NoClassDefFoundError:org/apache/spark/AccumulatorParam 与配置单元上的火花执行引擎
- android - 为什么我在添加依赖项时遇到此错误
- java - @ColumnTransformer 对我来说无法正常工作
- python - 如何重新创建错误的字符编码?葡萄牙语字符问题
- swift - NavigationLink 推送两次,然后弹出一次
- java - 为什么 Spring 的 Restarter 典当另一个线程
- python - 在一个应用程序中创建两个不同的配置文件
- java - 数据结构:map、Collectors、groupingBy
- python - 在 Django 中获取本地变量
- python - 如何使用“Chatterbot”模块在 Python 中训练我的聊天机器人