我希望在DataFrame中为每行找到3个最大值,但只能从某些列中找到(即,我的DataFrame中总共有10列,但我只希望它在计算最大值时考虑6列(。当找到3个最大的时
我想在现有的DataFrame中创建三个新列,称为"Top 1"、"Top 2"one_answers"Top 3"。我在Python中使用Pandas。
这是我的代码:
df_2 = pd.DataFrame(
df_1.apply(
lambda x: list(
df_1.columns[np.array(x).argsort()[::-1][:3]]
), axis=1
).to_list(), columns=['Top1', 'Top2', 'Top3']
)
我收到一条错误消息,因为当我只想查看列['t1', 't2', 't3', 't4', 't5', 't6']
时,此代码会考虑我的整个数据集。我将在代码中的何处输入此规范?
为了提高性能,不要使用apply
,因为引擎盖下的循环:
cols = ['t1', 't2', 't3', 't4', 't5', 't6']
df = pd.DataFrame(np.array(cols)[np.argsort(-df[cols].to_numpy(), axis=1)[:, :3]],
columns=['Top1', 'Top2', 'Top3'])
print (df)
尝试通过列表理解、Dataframe()
方法和nlargest()
方法:
col= ['t1', 't2', 't3', 't4', 't5', 't6']
out=pd.DataFrame([df[x].nlargest(3) for x in col])
或
稍微修改一下你的方法:
df_2 = pd.DataFrame(
df_1[col].apply(
lambda x: list(
df_1.columns[np.array(x).argsort()[::-1][:3]]
), axis=1
).to_list(), columns=['Top1', 'Top2', 'Top3']
)