我想使用* args在Pandas DataFrame的行数据上应用函数。 这可以这样做(玩具示例来检索最大行):
df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))
def f(*args):
cols = [c for c in args]
return max(cols)
m = list(map(f,df['A'],df['B'],df['C'],df['D']))
有没有办法以这种方式完成,而无需单独列出所有列?例如,当数据帧具有在运行时定义的任意列时。
找到最大值也可以用更简单的方式完成,但如何将任意函数应用于行(如果* args不可能)
答案 0 :(得分:2)
对于按行处理,您似乎需要apply
import '<module>'
,并且每行都转换为axis=1
:
Series
样品:
def f(x):
print (x)
#sample function
return x.max()
print (df.apply(f, axis=1))
np.random.seed(45)
df = pd.DataFrame(np.random.randint(0,100,size=(3, 4)), columns=list('ABCD'))
print (df)
A B C D
0 75 30 3 32
1 95 61 85 35
2 68 15 65 14
def f(x):
print (x)
#sample function
return x.max()
A 75
B 30
C 3
D 32
Name: 0, dtype: int32
A 95
B 61
C 85
D 35
Name: 1, dtype: int32
A 68
B 15
C 65
D 14
Name: 2, dtype: int32
如果需要清单:
print (df.apply(f, axis=1))
0 75
1 95
2 68
dtype: int64
答案 1 :(得分:1)
您在运行时组合列:
cols = [df[x] for x in 'ABCD']
并使用*args
:
m1 = list(map(f, *cols))
给出相同的结果:
m2 = list(map(f,df['A'],df['B'],df['C'],df['D']))
>>> m1 == m2
True
答案 2 :(得分:1)
如果要将特定列发送到指定为1的轴的函数,则可以使用apply
和lambda
,以便它可以按行排列,即
df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))
def f(*args):
cols = [c for c in args]
return max(cols)
m = df.apply(lambda x: f(x['A'],x['B'],x['C'],x['D']),axis=1)
输出:print(df.head(5))
A B C D 0 63 95 94 98 1 87 42 18 67 2 1 89 53 42 3 37 62 22 69 4 53 1 41 88
print(m.head(5))
0 98 1 87 2 89 3 69 4 88 dtype: int64