Python无法向新列添加正确的元组顺序

2024-05-01 21:25:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据框,我按points列排序:

      name    points
0  vanessa     8.6
3    james     8.3
2     mike     7.2
1     mark     6.3
4  charles     5.5

我尝试使用以下方法创建具有排名的新列:

df['rank']=pd.Series(tuple(range(1,6)))

我得到:

      name   points  rank
0  vanessa     8.6     1
3    james     8.3     4
2     mike     7.2     3
1     mark     6.3     2
4  charles     5.5     5

这不是我想要的。我使用df.rank()解决了这个问题:

df['rank']=df.points.rank(ascending=False).astype(int)

然后我得到:

      name   points  rank
0  vanessa     8.6     1
3    james     8.3     2
2     mike     7.2     3
1     mark     6.3     4
4  charles     5.5     5

问题是:

为什么我第一次使用df['rank']=pd.Series(tuple(range(1,6)))的尝试没有成功


Tags: 数据namedf排序rangepointsseriespd
3条回答

问题是如果在Series中没有指定索引,则创建默认的RangeIndex-0,1,2,..len(df)

解决方案是添加参数index以将数据与原始数据匹配:

df['rank']=pd.Series(tuple(range(1,6)), index=df.index)

pd.Series(…)生成自己的从0到4(包括0到4)的索引

df['rank'] = pd.Series(tuple(range(1,6)))

您实际上是根据此索引分配的。 您可以只传递一个简单的值列表(长度正确,等于len(df)),而不是pd.系列

问题是因为序列根据索引值分配值。使用df['rank']=pd.Series(tuple(range(1,6)))时,将根据索引分配值。检查您的输出:

      name   points  rank
0  vanessa     8.6     1 #First value, to the smallest index-value
3    james     8.3     4 #Fourth value, to the fourth smallest index-value
2     mike     7.2     3 #Third value, to the third smallest index-value
1     mark     6.3     2 #Second value, to the second smallest index-value
4  charles     5.5     5 #Fifth value, to the fifth smallest index-value

您可以使用reset_index()后跟一个set_index()来进行轮换:

df = df.reset_index()
df['rank'] = pd.Series(tuple(range(1,6)))
df = df.set_index('index')

相关问题 更多 >