我有一个包含多列的数据框df(不确定多少列)。列之一称为x
。我定义了一个函数my_function
,该函数将2列作为输入并对其进行处理并返回一个新列。
我想在数据框的所有列上执行my_function(df[x], df[y])
(其中y
是除x
以外的所有所有列),并返回具有完全相同的列名但更新值的新df来自my_function
:
new_df = my_function(df[x], df[y])
其中y = df中除x之外的所有列。最快的方法是什么?
答案 0 :(得分:1)
如果您的函数执行按行预处理,则可以对每一列使用apply方法(请参见doc):
columns = [item for item in df.columns.values if item!=x]
for c in coulmns:
df[c] = df.apply(lambda row: my_function(row[c], row[x]) ,axis=1)
如果没有,可以分享“ my_function”的身体吗?
最佳,
答案 1 :(得分:0)
您可以尝试以下操作:
x = 'col_name'
[my_function(df[x], df[col]) for col in df if col!=x]
示例:
df = pd.DataFrame( {'a':[1,2],'b':[4,3],'c':[5,9], 'd':[2,9]})
x = 'a'
df1 = pd.DataFrame({})
def my_function(a,b, name):
c = a+b
df1[name] = c
[my_function(df[x], df[col], name) for name, col in enumerate(df) if col!=x]
print df1
输出:
1 2 3
0 5 6 3
1 5 11 11
答案 2 :(得分:0)
使用更快的大熊猫应用功能的一种快速有效的解决方案是使用swifter,这是一个示例:
import pandas as pd
import swifter
def fnc(m,x,c):
return m*x+c
df = pd.DataFrame({"m": [1,2,3,4,5,6], "c": [1,1,1,1,1,1], "x":[5,3,6,2,6,1]})
df["y"] = df.swifter.apply(lambda x: fnc(x.m, x.x, x.c), axis=1)