Python Pandas:沿运行时定义的每行列映射函数(使用*args)

Python Pandas:沿运行时定义的每行列映射函数(使用*args),python,pandas,dataframe,Python,Pandas,Dataframe,我想使用*args对Pandas数据帧的行数据应用函数。 可以这样做(检索最大行数的玩具示例): 有没有一种方法可以这样做,而不必单独列出所有列?例如,当数据帧具有在运行时定义的任意列时 查找最大值也可以用更简单的方法完成,但是如何将任意函数应用于行(如果不可能使用*args)似乎需要使用轴=1进行逐行处理,并且每行都转换为系列: def f(x): print (x) #sample function return x.max() print (df.apply(f, a

我想使用*args对Pandas数据帧的行数据应用函数。 可以这样做(检索最大行数的玩具示例):

有没有一种方法可以这样做,而不必单独列出所有列?例如,当数据帧具有在运行时定义的任意列时

查找最大值也可以用更简单的方法完成,但是如何将任意函数应用于行(如果不可能使用*args)

似乎需要使用
轴=1
进行逐行处理,并且每行都转换为
系列

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).tolist())
[75, 95, 68]
您似乎需要使用
axis=1
按行处理,并且每行都转换为
系列

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).tolist())
[75, 95, 68]

您可以在运行时组装列:

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

您可以在运行时组装列:

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

如果要将特定列发送到轴指定为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)
输出:打印(测向头(5))

0 98 1 87 2 89 3 69 4 88 数据类型:int64
如果要将特定列发送到轴指定为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)
输出:打印(测向头(5))

0 98 1 87 2 89 3 69 4 88 数据类型:int64 你不能用吗?你不能用吗?似乎是“适当的”方式似乎是“适当的”方式