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
解决方案,因为实际上我有一个较大的数据集,具有不同的值,因此我无法简单地应用“分类”解决方案。非常感谢你的回答。