#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. ох. Правильно. Спасибо!