Python Pandas:沿运行时定义的每行列映射函数(使用*args)
我想使用*args对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
轴=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
你不能用吗?你不能用吗?似乎是“适当的”方式似乎是“适当的”方式