Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在dataframe中使用不同类型的列进行排序,每列都有升序和降序选项_Python_Pandas - Fatal编程技术网

Python 在dataframe中使用不同类型的列进行排序,每列都有升序和降序选项

Python 在dataframe中使用不同类型的列进行排序,每列都有升序和降序选项,python,pandas,Python,Pandas,我正试图找到一种方法,在一个数据帧中使用多个列来确定排名。这些列可以按不同的顺序(即升序或降序)进行贡献,也可以有不同的类型(即int或str) 我尝试将列数据放入元组中,然后使用rank方法对它们进行排序。但是,这仅为两列提供升序或降序排列 将熊猫作为pd导入 数据帧(数据={'String':['a','a','a','a','b','Integer':[1,2,3,3,1]}) df['tup']=df.apply(tuple,axis=1) #对于按升序考虑的两列 df['rank']=

我正试图找到一种方法,在一个数据帧中使用多个列来确定排名。这些列可以按不同的顺序(即升序或降序)进行贡献,也可以有不同的类型(即int或str)

我尝试将列数据放入元组中,然后使用rank方法对它们进行排序。但是,这仅为两列提供升序或降序排列

将熊猫作为pd导入
数据帧(数据={'String':['a','a','a','a','b','Integer':[1,2,3,3,1]})
df['tup']=df.apply(tuple,axis=1)
#对于按升序考虑的两列
df['rank']=df['tup'].rank()
#对于按降序考虑的两列
df['rank']=df['tup'].rank(升序=False)
我希望输出是下面的输出,其中字符串按升序考虑,整数按降序考虑

#应为
字符串整数tup秩
0A1(a,1)4.0
1A2(a,2)3.0
2 a 3(a,3)1.5
3 a 3(a,3)1.5
4b1(b,1)5.0
但是,这两列都被视为升序

#实际
字符串整数tup秩
0A1(a,1)1.0
1A2(a,2)2.0
2 a 3(a,3)3.5
3 a 3(a,3)3.5
4b1(b,1)5.0

我是通过分别计算两列的秩,然后将秩放入元组来实现的。然后,我可以对该元组使用rank方法

将熊猫作为pd导入
数据帧(数据={'String':['a','a','a','a','b','Integer':[1,2,3,3,1]})
df['tup']=tuple(zip(df['String'].rank(升序=True),df['Integer'].rank(升序=False)))
df['rank']=df['tup'].rank()
输出如下所示-

字符串整数tup秩
0A1(2.5,4.5)4.0
1A2(2.5,3.0)3.0
2 a 3(2.5,1.5)1.5
3 a 3(2.5,1.5)1.5
4B1(5.0,4.5)5.0

我是通过分别计算两列的秩,然后将秩放入元组来实现的。然后,我可以对该元组使用rank方法

将熊猫作为pd导入
数据帧(数据={'String':['a','a','a','a','b','Integer':[1,2,3,3,1]})
df['tup']=tuple(zip(df['String'].rank(升序=True),df['Integer'].rank(升序=False)))
df['rank']=df['tup'].rank()
输出如下所示-

字符串整数tup秩
0A1(2.5,4.5)4.0
1A2(2.5,3.0)3.0
2 a 3(2.5,1.5)1.5
3 a 3(2.5,1.5)1.5
4B1(5.0,4.5)5.0

以下是一种方法。您可以按照自己的意愿调整
升序
(或任意多列):

import pandas as pd
import numpy as np
df = pd.DataFrame(data={'String':['a','a','a','a','b'],'Integer':[1,2,3,3,1]})
df = df.sort_values(['String','Integer'], ascending=[True, False])
df['rank'] = np.arange(len(df)) + 1
df['rank'] = df.groupby(['String', 'Integer'])['rank'].transform('mean')
print(df)
输出:

  String  Integer  rank
2      a        3   1.5
3      a        3   1.5
1      a        2   3.0
0      a        1   4.0
4      b        1   5.0

我问了一个基于此的类似问题,以概括对多种类型的列进行排序的想法,你可以检查它,以给那些计算出答案的人评分

这里有一个方法。您可以按照自己的意愿调整
升序
(或任意多列):

import pandas as pd
import numpy as np
df = pd.DataFrame(data={'String':['a','a','a','a','b'],'Integer':[1,2,3,3,1]})
df = df.sort_values(['String','Integer'], ascending=[True, False])
df['rank'] = np.arange(len(df)) + 1
df['rank'] = df.groupby(['String', 'Integer'])['rank'].transform('mean')
print(df)
输出:

  String  Integer  rank
2      a        3   1.5
3      a        3   1.5
1      a        2   3.0
0      a        1   4.0
4      b        1   5.0

我问了一个基于此的类似问题,以概括对多种类型的列进行排序的想法,你可以检查它,以给那些计算出答案的人评分

您想先按字符串排序,再按整数排序吗?在本例中是。但我也对一种按不同顺序排列不同类型的通用方法感兴趣。您想先按字符串排序,然后按整数排序吗?在本例中是的。但我也对一种按不同顺序排列不同类型的通用方法感兴趣。可以通过添加
df['rank']=(df['String'].rank(升序=真)+df['Integer'].rank(升序=假)).rank()
No,(2,8)元组的秩高于(3,1)还应该注意,当使用字符串和整数时,我们试图解决
rank
问题,如果您使用完整的字词作为字符串,此解决方案将不会证明是该问题的一般解决方案。@CeliusStingher您能给出一个数据帧示例吗?这不是我的答案,检查示例数据帧和输出的答案。可以通过添加
df['rank']=(df['String'].rank(升序=True)+df['Integer'].rank(升序=False)).rank()来删除步骤。rank()
No,(2,8)元组的秩高于(3,1)。还应注意,我们正在尝试解决使用字符串和整数时的
rank
问题,如果您将完整单词作为字符串,则此解决方案将不能证明是此问题的一般解决方案。@CeliusStingher您可以给出一个示例数据帧吗?这不是我的答案,请检查我的答案以了解示例数据帧和输出。