如何对包含数字和字符串的DataFrame进行排序?

3
我有一个混合数据类型的Pandas DataFrame,包含字符串和整数值。我想按多个列 PriceName 降序排序此DataFrame的值。 字符串值(即Name)应按字母顺序排序,或者实际上可以完全忽略,因为最重要的是数字值。
问题在于目标列列表可能包含字符串和整数列,例如target_columns = ["Price","Name"]
d = {'1': ['25', 'AAA', 2], '2': ['30', 'BBB', 3], '3': ['5', 'CCC', 2], \
     '4': ['300', 'DDD', 2], '5': ['30', 'DDD', 3],  '6': ['100', 'AAA', 3]}

columns=['Price', 'Name', 'Class']

target_columns = ['Price', 'Name']
order_per_cols = [False] * len(target_columns)

df = pd.DataFrame.from_dict(data=d, orient='index')
df.columns = columns
df.sort_values(list(target_columns), ascending=order_per_cols, inplace=True)

目前,这段代码会出现以下错误信息:

TypeError: 'str'和'int'之间不支持'<'操作

期望的输出结果:

Price    Name    Class
300      DDD     2
100      AAA     3
30       DDD     3
30       BBB     3
25       AAA     2
5        CCC     2

你期望的输出是什么? - Erfan
@Erfan:请看我的更新。但是,如果有办法在“target_columns”中识别字符串列,则可以忽略字符串列的排序。 - Fluxy
那为什么不直接使用 df = df.sort_values('Price', ascending=False) 呢? - Erfan
2个回答

1
如果我理解正确,您想要一种通用的方法来从选择中排除object列。我们可以使用DataFrame.select_dtypes来实现这一点,然后按数值列排序:
# df['Price'] = pd.to_numeric(df['Price'])
numeric = df[target_columns].select_dtypes('number').columns.tolist()
df = df.sort_values(numeric, ascending=[False]*len(numeric))

   Price Name  Class
4    300  DDD      2
6    100  AAA      3
2     30  BBB      3
5     30  DDD      3
1     25  AAA      2
3      5  CCC      2

numeric允许int64float吗? - Fluxy
是的,引用自文档:“要选择所有数字类型,请使用np.number或'number'”。 - Erfan
抱歉,在我的情况下,所有的列都可能是“object”。那些确实是数字的列也可能是“object”或“datetime”,就像你在Price的情况下看到的一样。 - Fluxy
哦,我没有看到你的代码行 df['Price'] = pd.to_numeric(df['Price'])。但是我怎么知道 Price 应该被转换为 numeric 呢?我事先没有任何关于列类型的信息。 - Fluxy
属性错误:'Series'对象没有'select_dtypes'属性。 - Kardi Teknomo

0

另一种解决方案可能是 -

在 sort_values 函数中使用 'by' 参数

d = ({'1': ['25', 'AAA', 2], '2': ['30', 'BBB', 3], '3': ['5', 'CCC', 2], \
     '4': ['300', 'DDD', 2], '5': ['30', 'DDD', 3],  '6': ['100', 'AAA', 3]})

df = pd.DataFrame.from_dict(data=d,columns=['Price','Name','Class'],orient='index')
df['Price'] = pd.to_numeric(df['Price'])
df.sort_values(**by** = ['Price','Name'],ascending=False)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接