如何将熊猫字符串列拆分为不同的行?

时间:2019-07-07 17:46:15

标签: python-3.x pandas pandas-datareader

这是我的问题。我有这样的数据:

data = {
    'name': ["Jack ;; Josh ;; John", "Apple ;; Fruit ;; Pear"], 
    'grade': [11, 12],
    'color':['black', 'blue']
}

df = pd.DataFrame(data)

它看起来像:

                     name  grade  color
0    Jack ;; Josh ;; John     11  black
1  Apple ;; Fruit ;; Pear     12   blue

我希望它看起来像:

     name   age  color      
0    Jack   11   black
1    Josh   11   black
2    John   11   black
3    Apple  12   blue
4    Fruit  12   blue
5    Pear   12   blue

因此,首先我需要使用“ ;;”来拆分名称。然后将该列表分解为不同的行

2 个答案:

答案 0 :(得分:3)

使用Series.str.split进行DataFrame.stack整形,并使用DataFrame.join添加其他原始列:

c = df.columns
s = (df.pop('name')
       .str.split(' ;; ', expand=True)
       .stack()
       .reset_index(level=1, drop=True)
       .rename('name'))
df = df.join(s).reset_index(drop=True).reindex(columns=c)
print (df)
    name  grade  color
0   Jack     11  black
1   Josh     11  black
2   John     11  black
3  Apple     12   blue
4  Fruit     12   blue
5   Pear     12   blue

答案 1 :(得分:0)

您面临2个挑战:

  1. 用;分隔名称;进入列表,并将列表中的每个项目作为一列,以便:

    df['name']=df.name.str.split(';;') 
    df_temp = df.name.apply(pd.Series)  
    df = pd.concat([df[:], df_temp[:]], axis=1) 
    df.drop('name', inplace=True, axis=1)
    

结果:

    grade   color   0       1       2
0   11      black   Jack    Josh    John
1   12      blue    Apple   Fruit   Pear
  1. Melt 以获得所需结果的列表:

    df.melt(id_vars=["grade", "color"], 
        value_name="Name").sort_values('grade').drop('variable', axis=1)
    

所需结果:

    grade   color   Name
0   11      black   Jack
2   11      black   Josh
4   11      black   John
1   12      blue    Apple
3   12      blue    Fruit
5   12      blue    Pear