Значение суммирования путем дублирования некоторых других столбцов также в pandas кадре данных? - PullRequest
1 голос
/ 31 марта 2020

У меня есть фрейм данных, подобный thi:

df

ID              Brands          Age           Gender           City
1             BMW_Audi_VW       50             M               Milano
2               VW_BMW          45             F               SF

Я хотел бы разбить столбец Brands на "_" и хочу дублировать все столбцы, кроме City

Я могу сделать на основе столбца идентификатора, как это:

df = df.set_index('ID').stack().str.split('_', expand=True).unstack(-1).stack(0).reset_index()

, но он дублирует только столбец идентификатора. Мне нужны все столбцы, но не "Город"

Вот желаемый вывод , который я ищу:

ID              Brands          Age           Gender           City
 1             BMW               50             M               Milano
 1             Audi              50             M               None
 1             VW                50             M               None
 2             VW                45             F               SF
 2             BMW               45             F               None

1 Ответ

2 голосов
/ 31 марта 2020

Используйте DataFrame.explode со значениями разделенных столбцов на Series.str.split, а затем установите None s на DataFrame.mask:

df = df.assign(Brands = df['Brands'].str.split('_')).explode('Brands')

include = ['ID','Brands','Age','Gender']
cols = df.columns.difference(include)
df[cols] = df[cols].mask(df.index.to_series().duplicated(), None)
df = df.reset_index(drop=True)
print (df)
   ID Brands  Age Gender    City
0   1    BMW   50      M  Milano
1   1   Audi   50      M    None
2   1     VW   50      M    None
3   2     VW   45      F      SF
4   2    BMW   45      F    None

РЕДАКТИРОВАТЬ:

Проверьте разницу:

#Brands column is assigned to Brands column (to same column)
df1= df.assign(Brands = df['Brands '].str.split('_')).explode('Brands')
print (df1)
   ID Brands  Age Gender    City
0   1    BMW   50      M  Milano
0   1   Audi   50      M  Milano
0   1     VW   50      M  Milano
1   2     VW   45      F      SF
1   2    BMW   45      F      SF

#Brands column is assigned to Brands1 column (to another column)
df2 = df.assign(Brands1 = df['Brands'].str.split('_')).explode('Brands')
print (df2)
   ID       Brands  Age Gender    City          Brands1
0   1  BMW_Audi_VW   50      M  Milano  [BMW, Audi, VW]
1   2       VW_BMW   45      F      SF        [VW, BMW]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...