根据符号将列中的值拆分为新行

时间:2019-11-27 13:05:10

标签: python pandas dataframe

我有这种形式的pandas数据框:

A         B       C       D
car      100     EUR      T
train    20/r25  EUR/rUSD F
e-bike   10/r21  EUR/rGBP F

我想在此/r符号上拆分那些列(包含该符号的thos列),以便重复其他列,如结果df所示:

结果df:

A         B       C   D
car      100     EUR  T
train    20      EUR  F
train    25      USD  F 
e-bike   10      EUR  F
e-bike   21      GBP  F

1 个答案:

答案 0 :(得分:2)

DataFrame.set_index用所有未拆分的列创建IndexMultiIndex,然后用Series.str.splitDataFrame.stack每列,转换MultiIndex到列中,并添加DataFrame.reindex以获得与原始列相同的列顺序,也可以删除level列:

df1 = (df.set_index(['A', 'D'])
        .apply(lambda x: x.str.split('/r', expand=True).stack())
        .reset_index()
        .reindex(df.columns, axis=1))
print (df1)
        A    B    C  D
0     car  100  EUR  T
1   train   20  EUR  F
2   train   25  USD  F
3  e-bike   10  EUR  F
4  e-bike   21  GBP  F

编辑:

df1 = (df.set_index(['D','E', 'F','G'])
        .apply(lambda x: x.str.split('\r', expand=True).stack(dropna=False))
        .reset_index()
        .reindex(df.columns, axis=1)
        )
print (df1)
           A           B    C                           D             E  \
0      NUMER        DATA  WAL  OKRESY WIEKOWANIA W DNIACH           NaN   
1  DOKUMENTU    OPERACJI  UTA  OKRESY WIEKOWANIA W DNIACH           NaN   
2        NaN         NaN  NaN                       do 90  od 91 do 180   
3        NaN         NaN  NaN                       do 90  od 91 do 180   
4        NaN  2015-03-09  EUR                         NaN           NaN   
5        NaN        None  PLN                         NaN           NaN   
6        NaN  2015-12-07  EUR                         NaN           NaN   
7        NaN        None  PLN                         NaN           NaN   

               F              G         H  
0            NaN            NaN       NaN  
1            NaN            NaN       NaN  
2  od 181 do 270  od 271 do 360    od 361  
3  od 181 do 270  od 271 do 360      None  
4            NaN            NaN     10,56  
5            NaN            NaN     43,60  
6            NaN            NaN  1 368,24  
7            NaN            NaN  5 902,72