如何根据列中的子字符串对数据框进行排序?

问题描述 投票:0回答:1

我有一个带有字符串行的数据框。我想根据此列中的字符串对整个数据框进行排序。但是,有些行包含一个子字符串,该子字符串是另一行中的文本,因此它弄乱了顺序。我的数据框看起来像:

  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

如何排序此数据框,使其处于正确的顺序,即使它存在于另一行的子字符串?

python pandas dataframe sorting
1个回答
0
投票

我们可以在订单列表中使用 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
© www.soinside.com 2019 - 2024. All rights reserved.