输入DF :
Index Parameters A B C
1 Apple 1 2 3
2 Banana 2 4 5
3 Potato 3 5 2
4 Tomato 1 x 4 1 x 6 2 x 12
输出DF
Index Parameters A B C
1 Apple 1 2 3
2 Banana 2 4 5
3 Potato 3 5 2
4 Tomato_P 1 1 2
5 Tomato_Q 4 6 12
问题陈述:
我想根据特定的列值(Tomato)
并将拆分参数设为x
将一行数据转换为多行
代码/发现:
我有一个代码,如果我转置此数据集然后应用here或here的答案然后重新转置相同的代码,效果很好。
寻找可以直接在给定数据帧上使用的解决方案
答案 0 :(得分:1)
如果数据中始终只有一个x
值的解决方案-首先按列表中的列按Series.str.split
,然后按Series.explode
,按DataFrame.join
添加所有其他列并设置{{1 }}与_P
和Series.duplicated
和numpy.select
:
_Q
编辑:
没有cols = ['A','B','C']
df[cols] = df[cols].apply(lambda x : x.str.split(' x '))
df1 = pd.concat([df[x].explode() for x in cols],axis=1)
#print (df1)
df = df[df.columns.difference(cols)].join(df1)
df['Parameters'] += np.select([df.index.duplicated(keep='last'),
df.index.duplicated()],
['_P','_Q'],
default='')
df = df.reset_index(drop=True)
print (df)
Parameters A B C
0 Apple 1 2 3
1 Banana 2 4 5
2 Potato 3 5 2
3 Tomato_P 1 1 2
4 Tomato_Q 4 6 12
的答案:
explode
cols = df.columns[1:]
df1 = (pd.concat([df[x].str.split(' x ', expand=True).stack() for x in cols],axis=1, keys=cols)
.reset_index(level=1, drop=True))
print (df1)
A B C
Index
1 1 2 3
2 2 4 5
3 3 5 2
4 1 1 2
4 4 6 12
答案 1 :(得分:0)
这更像是currentNotebook
问题,在熊猫0.25之后可用
explode