一次分配给多个列(python pandas)

做作

因此,我昨天开始提出一个问题:基于同一行中的值以熊猫为单位进行多次分配,我想知道如何对一行数据进行排名并将排名分配给同一行中的不同列。我从这里开始遵循Ed Chum的建议,弄清楚了如何做到这一点:如何一次将函数应用于pandas数据框中的多个列

它确实有效,但是后来我注意到我在创建过程中创建了不正确的列。而且,一旦我修复了该错误,它便不再起作用。

因此,我尝试在一个玩具示例上重新创建该问题,并且在玩具示例上也无法正常工作。有人可以指出我的错误,这是代码(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

耶斯列尔

您可以返回Series带有索引的新列的值:

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_")]

    return pd.Series(ranked, index=rank_cols)

df = df.apply(lambda row: apply_rank(row),axis=1)
print (df)
   rank_a  rank_b  rank_c
0   0.250   0.500   0.750
1   0.750   0.375   0.375
2   0.625   0.625   0.250

编辑:如果之前可能存在新列,则将数据追加到它们并返回row

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_")]

    row.loc[rank_cols] = ranked
    return row

df = df.apply(apply_rank,axis=1)
print (df)
     a    b    c  rank_a  rank_b  rank_c
0  1.0  2.0  3.0   0.250   0.500   0.750
1  2.0  1.0  1.0   0.750   0.375   0.375
2  3.0  3.0  2.0   0.625   0.625   0.250

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将多个numpy列分配给一个pandas数据框列

Python / Pandas:基于多个列/行值将值分配给列

将值分配给Pandas中的多个列

将列分配给pandas df

根据多个条件将现有列的值分配给 Pandas 中的新列

awk一次分配给多个变量

一次将随机分配给多个值

在Python中一次将多个属性分配给一个对象

Pandas DataFrame:如果满足多个条件,则将整数分配给新列

创建多个空列并将其分配给pandas数据框中的0

如何使用Pandas DataFrame中的函数添加多个列并分配给新的列名?

在 Pandas 中将一列的值分配给多列

根据另一列中的变量将Pandas中的值分配给该列

在python / pandas中一次更改多个列的数据类型

Pandas 列出列中的唯一值并将其分配给单独的列

Python:使用其他列将值分配给Pandas中的新列作为列表

如何将python对象(例如字典)分配给pandas列

Python Pandas根据字典键将字典值分配给数据框列

如何将 python 对象(如字典)分配给 pandas 列?

将组平均值分配给python / pandas中的每一行

查找值并将值分配给Pandas中的列

将 numpy 矩阵分配给 pandas 列

无法将值分配给Pandas中的某些列

如何根据pandas中的组最大值将一列的标签分配给新的一列

Python Pandas .loc一次更新2列

将多个条件值分配给百分位数到新的pandas列中

Python Pandas:将不同长度的列表作为一行分配给pandas数据框

一次将多个变量分配给多个值 R?

将一个 Pandas 数据框中的多行和多列分配给另一个