Python 熊猫排序_值()问题。应用键参数时排序整数错误

Python 熊猫排序_值()问题。应用键参数时排序整数错误,python,pandas,Python,Pandas,大家好,我试着到处寻找这个问题,但我无法找到解决办法。如果你能帮助我,我会很高兴的 所以,基本上我有这个数据集: df=pd.DataFrame({“col1”:['xxx','xxx','xxx','kkk','www','www'], “col2:[2020、1994、2013、1000、1996、2021]} df.dtypes col1对象 col2 int64 数据类型:对象 我想对第一列按肋顺序排列,第二列按升序排列。最终结果应如下所示: col1 col2 4 www.1996

大家好,我试着到处寻找这个问题,但我无法找到解决办法。如果你能帮助我,我会很高兴的

所以,基本上我有这个数据集:

df=pd.DataFrame({“col1”:['xxx','xxx','xxx','kkk','www','www'],
“col2:[2020、1994、2013、1000、1996、2021]}
df.dtypes
col1对象
col2 int64
数据类型:对象
我想对第一列按肋顺序排列,第二列按升序排列。最终结果应如下所示:

col1 col2
4 www.1996
5 www.2021
3 kkk 1000
0 xxx 1994
2013年1月30日
2020年2月30日
因此,为了实现这一点,我做了以下工作:

d={'xxx':4,'zzz':1,'yyy':5,'kkk':2,'jjj':3,'www':0}定制订单
df.sort_值(by=['col1','col2'],key=lambda x:x.map(d))
但我最终得出的结论是:

col1 col2
4 www.1996
5 www.2021
3 kkk 1000
0 xxx 2020
1994年1月30日
2013年3月2日
如果我这样做:

df.sort_值(按=['col1','col2'])
col1 col2
3 kkk 1000
4 www.1996
5 www.2021
1994年1月30日
2013年3月2日
0 xxx 2020

可乐订得很好。我真的不知道我为什么会有这个问题。有没有人经历过类似的事情?谢谢

可能的技巧是通过
col2
中的值来扩展字典:

d = {'xxx': 4, 'zzz':1, 'yyy':5, 'kkk':2, 'jjj':3, 'www':0} # to customize order 
d = {**d, **dict(zip(df.col2, df.col2))}

df = df.sort_values(by = ['col1' , 'col2'], key = lambda x: x.map(d))
print (df)
  col1  col2
4  www  1996
5  www  2021
3  kkk  1000
1  xxx  1994
2  xxx  2013
0  xxx  2020
或使用
get
的解决方案-如果未返回匹配项,则返回相同的值
NaN

df = df.sort_values(by = ['col1' , 'col2'], key = lambda x: x.map(lambda y: d.get(y, y)))
print (df)
  col1  col2
4  www  1996
5  www  2021
3  kkk  1000
1  xxx  1994
2  xxx  2013
0  xxx  2020
具有辅助列的解决方案:

d = {'xxx': 4, 'zzz':1, 'yyy':5, 'kkk':2, 'jjj':3, 'www':0} 

df = df.assign(new=df['col1'].map(d)).sort_values(by=['new','col2']).drop('new', axis=1)
print (df)
  col1  col2
4  www  1996
5  www  2021
3  kkk  1000
1  xxx  1994
2  xxx  2013
0  xxx  2020
试试这个-

df  =df.groupby('col1')['col2'].apply(sorted).explode().reset_index()
d = {'xxx': 4, 'zzz':1, 'yyy':5, 'kkk':2, 'jjj':3, 'www':0} 
df['sorted'] = df['col1'].map(d)
df = df.sort_values('sorted').drop('sorted', axis=1)

col1更改为按顺序排列的类别

df = pd.DataFrame({"col1": ['xxx', 'xxx', 'xxx', 'kkk', 'www', 'www'],
                 "col2": [ 2020, 1994, 2013, 1000, 1996, 2021]})
d = {'xxx': 4, 'zzz':1, 'yyy':5, 'kkk':2, 'jjj':3, 'www':0} # to customize order 

df["col1"] = pd.Categorical(df["col1"], sorted(list(d.keys()), key=lambda x: d[x]), ordered=True)
df.sort_values(["col1","col2"])
可乐 可乐 4. 万维网 1996 5. 万维网 2021 3. kkk 1000 1. xxx 1994 2. xxx 2013 0 xxx 2020
创建新列,将其映射到词典,按其排序,然后删除:)

df=pd.DataFrame({“col1”:['xxx','xxx','xxx','kkk','www','www'],
“col2:[2020、1994、2013、1000、1996、2021]}
d={'xxx':4,'zzz':1,'yyy':5,'kkk':2,'jjj':3,'www':0}自定义顺序
df['sorting']=df['col1'].map(d)
df=df.sort\u值(“排序”)
del df[“排序”]
熊猫有一个数据类型“categorical”,它可以做到:

import pandas as pd
df = pd.DataFrame({"col1": ['xxx', 'xxx', 'xxx', 'kkk', 'www', 'www'],
                 "col2": [ 2020, 1994, 2013, 1000, 1996, 2021]})

df["col1"] = pd.Categorical(df["col1"], ordered=True,
             categories=['www', 'zzz', 'kkk', 'jjj', 'xxx', 'yyy'])


df.sort_values(["col1", "col2"], ascending = (True, True))

  col1  col2
4  www  1996
5  www  2021
3  kkk  1000
1  xxx  1994
2  xxx  2013
0  xxx  2020

嗯,这不是虫子。当将键传递给多个列时,您希望从中得到什么?它将应用于每一列并用作排序键。d中没有任何col2元素,因此它返回None(我认为是这样,因为没有引发错误,因此它可能使用
d.get(x,None)
)。对于您的用例,最简单的解决方案是排序两次:

df.sort_values(by='col2').sort_values(by='col1', key=lambda x: x.map(d))

我还检查了我的假设是否正确。如果在代码示例中设置
key=x.map(lambda t:d[t])
而不是
x.map(d)
,则会出现错误,说明密钥不匹配。因此,您确实尝试将其应用于两个列并按结果排序。

因此,最后我使用了
get
解决方案,因为实际上我有一个较大的数据集,具有不同的值,因此我无法简单地应用“分类”解决方案。非常感谢你的回答。