我有一个带有字符串行的数据框。我想根据此列中的字符串对整个数据框进行排序。但是,有些行包含一个子字符串,该子字符串是另一行中的文本,因此它弄乱了顺序。我的数据框看起来像:
col1 col2 col3 col4
Animal Tiger Cat Dog
Name Adam Grace Julia
Street Name1 Pine St Crown St Palm Ave
Street Name2 Grey St Tree St New St
Color Green Blue Yellow
Interest Yes No Yes
Low Interest No No Yes
High Interest Yes No Yes
City2 x z y
City1 m r t
我想对其进行排序,使其看起来像:
col1 col2 col3 col4
Name Adam Grace Julia
Street Name1 Pine St Crown St Palm Ave
Street Name2 Grey St Tree St New St
City1 m r t
City2 x z y
Interest Yes No Yes
High Interest Yes No Yes
Low Interest No No Yes
Animal Tiger Cat Dog
Color Green Blue Yellow
我尝试使用:
order = ['Name', 'Street Name', 'City', 'Interest','High Interest','Low Interest', 'Animal', 'Color']
df['order'] = df['col1'].apply(order)
df = df.sort_values(by = 'order').drop(columns = 'order')
但是,这产生了一个问题,即“街道名称”行出现在“名称”之前,因为“名称”同时存在于两者中。喜欢:
col1 col2 col3 col4
Street Name1 Pine St Crown St Palm Ave
Street Name2 Grey St Tree St New St
Name Adam Grace Julia
如何排序此数据框,使其处于正确的顺序,即使它存在于另一行的子字符串?
我们可以在订单列表中使用 DataFrame 中的确切字符串,而不是部分匹配,然后使用
pd.Categorical()
而不是 apply()
。这样,分类类型就遵循我们指定的确切顺序。
df = pd.DataFrame(data)
# Your custom order
order = ['Name', 'Street Name1', 'Street Name2', 'City1', 'City2',
'Interest', 'High Interest', 'Low Interest', 'Animal', 'Color']
# Create a categorical type with our custom order
df['order'] = pd.Categorical(df['col1'], categories=order, ordered=True)
# Sort the DataFrame and drop the temporary column
df_sorted = df.sort_values('order').drop(columns='order')
print(df_sorted)
输出:
col1 col2 col3 col4
1 Name Adam Grace Julia
2 Street Name1 Pine St Crown St Palm Ave
3 Street Name2 Grey St Tree St New St
9 City1 m r t
8 City2 x z y
5 Interest Yes No Yes
7 High Interest Yes No Yes
6 Low Interest No No Yes
0 Animal Tiger Cat Dog
4 Color Green Blue Yellow