python - 熊猫:按组爆炸(重复)
问题描述
我有一个看起来像这样的df:
df = pd.DataFrame(data={
'id': ["idx1"],
'test_A': ["ABC", ],
'test_B': ["X"],
'test_C': ["ABC / XYZ"],
'test_D': ["ABC / JKL / XYZ"]})
这是一行的示例,但有数千行。我想分解这四个“TEST”列中有多个值的每个值,即。我希望每个人都为每个相同的“测试”复制行,如果有很多(用“/”分隔)我也想复制。如果重复内容不包含任何内容,我想要一个“X”。
当然还有很多其他列,对于这些列的重复值无关紧要:它应该保持不变。我不知道如何解释它,但这里有一个我想要的输出示例,用于我提供的输入:
df = pd.DataFrame(data={
'id': ["idx1", "idx1", "idx1"],
'test_A': ["ABC", "X", "X"],
'test_B': ["X", "X", "X"],
'test_C': ["ABC", "XYZ", "X"],
'test_D': ["ABC", "XYZ", "JKL"]})
解决方案
样本:
df = pd.DataFrame(data={
'id': ["idx1", 'idx0'],
'test_A': ["ABC",'SSD' ],
'test_B': ["X", 'ABC / JKL / XYZ'],
'test_C': ["ABC / XYZ", 'aa'],
'test_D': ["ABC / JKL / XYZ", 'ABC / JKL']})
想法是先用 整形DataFrame.melt
,然后使用Series.str.split
andDataFrame.explode
和最后一次GroupBy.cumcount
用于计数器,idx
列用于排序,最后用DataFrame.set_index
and整形Series.unstack
:
df1 = df.melt('id', ignore_index=False)
df1['value'] = df1['value'].str.split(' / ')
df1 = df1.explode('value').rename_axis('idx').reset_index()
g = df1.groupby(['idx','id','variable']).cumcount()
df1 = (df1.set_index([g,'idx','id','variable'])['value']
.unstack(fill_value='X')
.sort_index(level=1)
.reset_index(level=2)
.reset_index(drop=True)
.rename_axis(None, axis=1))
print (df1)
id test_A test_B test_C test_D
0 idx1 ABC X ABC ABC
1 idx1 X X XYZ JKL
2 idx1 X X X XYZ
3 idx0 SSD ABC aa ABC
4 idx0 X JKL X JKL
5 idx0 X XYZ X X
推荐阅读
- godot - Godot delta的行为非常奇怪
- android - 如何使用 MediaStore 检查文件是否存储在 SD 卡上?
- reactjs - 生产构建中的代码运行速度比 reactjs 中的开发服务器慢
- firebase - 如果留空,如何不将字段保存到 Fireabse
- java - 当我输入 A、B、C 或 D 时,它仍然显示 That is not a valid answer。为什么?
- javascript - 离开视图时,基于片段的对话框不会在 UI5 中销毁/重置
- typescript - 使用 Vue 3 Composition API 创建全局商店
- php - 是否可以回显存储在其中包含 PHP 回显语句的数据库中的文本
- java - MongoDB Realm Studio 10.0.0 如何解密加密数据库?
- java - 后缀的中缀,我的程序已编译但不会产生输出。(爪哇)