繁体   English   中英

熊猫数据框根据索引/列名应用函数

[英]pandas dataframe apply a function depending on index/column name

multipliers = {'A' : 5, 'B' : 10, 'C' : 15, 'D' : 20}
df = pd.util.testing.makeDataFrame() # a random df with columns A,B,C,D

f = lambda x, col: multipliers[col] * x

是否有 Pandas 非循环方式将f应用于每一列,例如df.apply(f, axis = 0, ?) 我可以用循环实现的是

df2 = df.copy()
for c in df.columns:
    df2[c] = f(df[c], c)

(real f比上面的例子复杂,请把f看成是两个变量的黑盒函数,arg1是数据,arg2是列名)

使用 lambda 函数和传递列名使用x.name

np.random.seed(2022)
multipliers = {'A' : 5, 'B' : 10, 'C' : 15, 'D' : 20}
df = pd.util.testing.makeDataFrame() # a random df with columns A,B,C,D

f = lambda x, col: multipliers[col] * x
df2 = df.copy()
for c in df.columns:
    df2[c] = f(df[c], c)
print (df2.head())
                    A          B          C          D
9CTWXXW3ys   2.308860   6.375789   5.362095 -23.354181
yq1PHBltEO   2.876024   1.950080  15.772909 -13.776645
lWtMioDq6A -11.206739  17.691500 -12.175996  25.957264
lEHcq1pxLr  -6.510434  -6.004475  14.084401  13.999673
xvL04Y66tm  -3.827731  -3.104207  -4.111277   1.440596

df2 = df.apply(lambda x: f(x, x.name))
print (df2.head())
                    A          B          C          D
9CTWXXW3ys   2.308860   6.375789   5.362095 -23.354181
yq1PHBltEO   2.876024   1.950080  15.772909 -13.776645
lWtMioDq6A -11.206739  17.691500 -12.175996  25.957264
lEHcq1pxLr  -6.510434  -6.004475  14.084401  13.999673
xvL04Y66tm  -3.827731  -3.104207  -4.111277   1.440596

您可以将字典转换为系列并将函数转换为矢量化操作。 例如:

df * pd.Series(multipliers)

您还可以使用接受函数字典的方法transform

def func(var):
    # return your function
    return lambda x: x * var

df.transform({k: func(v) for k, v in multipliers.items()})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM