Как разбить столбец строки Pandas на разные строки? - PullRequest
1 голос
/ 07 июля 2019

Вот моя проблема.У меня есть такие данные:

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 ]

3 голосов
/ 07 июля 2019

Используйте 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
0 голосов
/ 08 июля 2019

У вас есть 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

Расплав список для получения желаемого результата:

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
...