基于包含值的其他列复制行,然后 return 具有拆分列值的行

Duplicate rows based on other columns containing values, then return row with split column value

我有这个 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

感谢您对此的帮助!

试试这个:

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 我们可以使用 str 访问器和 splitGroup 重新分配为由 '-' 分隔的字符串列表。然后使用 pd.DataFrame.explode 我们可以分解该列表以在数据框中为列表中的每个元素创建行。