Python 中的数据拆分、熔化和转换

Data Splitting, Melting, and Transformation in Python

我有以下代码:

split_melt_and_transform_this_df = {'Concat' : [('AA,ABC,1,10,|','BB,ABC,,1,Z|','BB,ABC,,1,Z|''CC,ABC,50,,Z|'),('AA,ABC,1,10,|','BB,ABC,1,,Z|'),('AA,ABC,1,10,|','BB,ABC,1,,Z|'),('AA,ABC,5,,z|')], 'Item' : ['Backstreet Boys','NYSYNC', 'One Direction', 'Nirvana']}
split_melt_and_transform_this_df = pd.DataFrame(split_this_df)
split_melt_and_transform_this_df


我想将此 'Current DF' 转换为以下 'Desired DF1' 和 'Desired DF2' 数据帧:

DF2 是特别棘手的部分。最后一列中的所有 'Z' 值都必须是无穷大。如果最后一列中的行为空,则显示相邻列行中的值(即倒数第二列,其中显示“10”值)。

你可以尝试explode得到df1

df1 = df.explode('Concat', ignore_index=True)
print(df1)

          Concat             Item
0  AA,ABC,1,10,|  Backstreet Boys
1   BB,ABC,,1,Z|  Backstreet Boys
2   BB,ABC,,1,Z|  Backstreet Boys
3  CC,ABC,50,,Z|  Backstreet Boys
4  AA,ABC,1,10,|           NYSYNC
5   BB,ABC,1,,Z|           NYSYNC
6  AA,ABC,1,10,|    One Direction
7   BB,ABC,1,,Z|    One Direction
8   AA,ABC,5,,Z|          Nirvana

要获得df2,您可以尝试拆分Concat列并将列表列转换为数据框。

df2 = df1.join(pd.DataFrame(df1.pop('Concat').str.split(',').tolist(), index=df1.index))
df2[4] = np.select([df2[4].eq('|'), df2[4].eq('Z|')], [df2[3], np.inf])
print(df2)

              Item   0    1   2   3    4
0  Backstreet Boys  AA  ABC   1  10   10
1  Backstreet Boys  BB  ABC       1  inf
2  Backstreet Boys  BB  ABC       1  inf
3  Backstreet Boys  CC  ABC  50      inf
4           NYSYNC  AA  ABC   1  10   10
5           NYSYNC  BB  ABC   1      inf
6    One Direction  AA  ABC   1  10   10
7    One Direction  BB  ABC   1      inf
8          Nirvana  AA  ABC   5      inf