根据列值将行拆分为多行

时间:2019-10-13 17:37:37

标签: python pandas

输入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将一行数据转换为多行

代码/发现

我有一个代码,如果我转置此数据集然后应用herehere的答案然后重新转置相同的代码,效果很好。

寻找可以直接在给定数据帧上使用的解决方案

2 个答案:

答案 0 :(得分:1)

如果数据中始终只有一个x值的解决方案-首先按列表中的列按Series.str.split,然后按Series.explode,按DataFrame.join添加所有其他列并设置{{1 }}与_PSeries.duplicatednumpy.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