Дублировать строки на основе других столбцов, содержащих значения, затем возвращать строку со значением разделенного столбца

#python #pandas #dataframe #duplicates #strsplit

#python #pandas #фрейм данных #дубликаты #strsplit

Вопрос:

У меня есть этот df, который содержит строки, которые необходимо дублировать на основе количества букв, разделенных на ‘-‘ в столбце ‘Group’. Я хочу, чтобы каждая дублированная строка содержала только одну букву из столбца ‘Group’. XYZ не имеет никаких «-» и останется как одна не дублирующаяся строка. Начало df:

 Date    End Time    Group   Assignment
2/2/2021    1130    A-B-C   quiz
2/2/2021    1230    XYZ     test
1/22/2021   1330    B-D     paper
1/22/2021   1130    A-E-C   homework
 

Я предпринял несколько попыток для этого, но не могу получить его. Вот один из примеров того, что я пробовал:

 df[['Group_1', 'Group_2', 'Group_3']] = df['Group'].str.split('-', expand=True)
df.drop(columns=['Group'], inplace=True)
df.to_csv('baz_schedule_modified.csv', index=False)

reps = [2 if not (val is np.nan) else 1 for val in df['Group_2']]  
df = df.loc[np.repeat(df.index.values, reps)]
 

Но я не знал, куда идти дальше.

Я хочу, чтобы df заканчивался следующим образом:

 Date    End Time    Group_1 Assignment
1/22/2021   1130    A   homework
1/22/2021   1330    B   paper
1/22/2021   1130    C   homework
1/22/2021   1330    D   paper
1/22/2021   1130    E   homework
2/2/2021    1130    A   quiz
2/2/2021    1130    B   quiz
2/2/2021    1130    C   quiz
2/2/2021    1230    XYZ test
 

Спасибо за вашу помощь в этом!

Ответ №1:

Попробуйте это:

 df.assign(Group=df['Group'].str.split('-')).explode('Group')
 

Вывод:

         Date  End Time Group Assignment
0   2/2/2021      1130     A       quiz
0   2/2/2021      1130     B       quiz
0   2/2/2021      1130     C       quiz
1   2/2/2021      1230   XYZ       test
2  1/22/2021      1330     B      paper
2  1/22/2021      1330     D      paper
3  1/22/2021      1130     A   homework
3  1/22/2021      1130     E   homework
3  1/22/2021      1130     C   homework
 

Используя assign , мы можем переназначить Group как список строк, разделенных символом ‘-‘, используя str accessor и split . Затем, используя pd.DataFrame.explode , мы можем разобрать этот список, чтобы создать строки в dataframe для каждого элемента в списке.

Комментарии:

1. можете ли вы объяснить, почему «df[‘Group’] = df[‘Group’].str.split(‘-‘).explode(‘Group’)» не будет работать, но назначение сделает свое дело? Спасибо

2. Вы используете pd.Series.explode вместо pd.DataFrame.explode . Когда вы используете df[colname] , вы создаете серию. Вы можете использовать explode, но вы не расширяете фрейм данных. итак, вы пытаетесь установить для столбца dataframe значение pd.Series длиннее, чем dataframe.

3. ох. Правильно. Спасибо!