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
我有以下代码:
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