Pandas:在运行时定义的每行列的map函数(使用* args)

时间:2017-07-30 12:04:55

标签: python pandas dataframe

我想使用* 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不可能)

3 个答案:

答案 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的轴的函数,则可以使用applylambda,以便它可以按行排列,即

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