【发布时间】:2018-05-06 03:09:31
【问题描述】:
所以我昨天开始了一个问题:Multiple assignment in pandas based on the values in the same row,我想知道如何对一行数据进行排名并将排名分配给同一行中的不同列。我已经从这里按照 Ed Chum 的建议弄清楚了如何做到这一点: how to apply a function to multiple columns in a pandas dataframe at one time.
它确实有效,但后来我注意到我在此过程中创建了不正确的列。一旦我修复了这个错误,它就不再起作用了......
所以我尝试在玩具示例上重新创建问题,但它也不适用于玩具示例。有人可以指出错误,这是代码(python 3):
import pandas as pd
import numpy as np
import scipy
df = pd.DataFrame(data={'a':[1,2,3],'b':[2,1,3],'c':[3,1,2],
'rank_a':[np.nan]*3,'rank_b':[np.nan]*3,'rank_c':[np.nan]*3})
def apply_rank(row):
vals = [row['a'],row['b'],row['c']]
ranked = scipy.stats.rankdata(vals)
d = len(vals)+1
ranked = [rank/d for rank in ranked]
rank_cols = [col for col in row.index if col.startswith("rank_")]
print("ranked: "+str(ranked))
for idx,rank_col in enumerate(rank_cols):
print("Before: "+str(row[rank_col]))
row[rank_col] = ranked[idx]
print("After: "+str(row[rank_col]))
然后运行:
df.apply(lambda row: apply_rank(row),axis=1),查看作业是否正确完成。
然后运行:
df 看到没有分配任何内容.. facepalm
【问题讨论】:
-
这能回答你的问题吗? Return multiple columns from apply pandas
-
无论如何,pandas 对于 DataFrame 和 Series 都有自己的原生
rank()function。所以你不需要实现这个。