将Python函数应用于多个Pandas列

时间:2019-06-14 09:51:11

标签: python pandas

我正在尝试编写一个函数并将其应用于熊猫数据框中的多个字段。 该函数采用列colA1,并根据条件语句为新列colB2分配值。 如果给定单列,例如colA1,但是我怎么写它来遍历 列列表,返回相应数量的新列?

以下函数在单个列上起作用:

dict = {'colA1':[2,6,8,28,5], 
    'colA2': [38,6,14,63,3], 
    'colA3':[90,40,80,98,3]} 

df = pd.DataFrame(dict) 

def function(x):
    if x <= 10:
        return '<= 10'
    elif x > 10:
        return '> 10' 

df['colB1']=df['colA1'].apply(function)

df['colB1']

这将返回:

0    <= 10
1    <= 10
2    <= 10
3    > 10
4    <= 10

我尝试将其应用于多个列,如下所示: Update Multiple Columns using Pandas Apply Function

df[['colB1', 'colB2', 'colB3']]=df[['colA1', 'colA2', 'colA3']].apply(function)

但这返回: ValueError:('系列的真值不明确。请使用a.empty,a.bool(),a.item(),a.any()或a.all()。','发生在索引colA1处' )

2 个答案:

答案 0 :(得分:4)

如果这实际上是您想要执行的操作,则更快的替代方法是np.select()

cond=[df<= 10,df > 10]
choice=['<= 10','> 10' ]
df[:]=np.select(cond,choice)
print(df)

   colA1  colA2  colA3
0  <= 10   > 10   > 10
1  <= 10  <= 10   > 10
2  <= 10   > 10   > 10
3   > 10   > 10   > 10
4  <= 10  <= 10  <= 10

您也可以尝试使用df.applymap()来实现功能:

df[['colA1','colA2','colA3']].applymap(function)
#df.applymap(function)

   colA1  colA2  colA3
0  <= 10   > 10   > 10
1  <= 10  <= 10   > 10
2  <= 10   > 10   > 10
3   > 10   > 10   > 10
4  <= 10  <= 10  <= 10

答案 1 :(得分:1)

这应该做

df.apply(lambda x: pd.Series([function(x['colA1']),function(x['colA2']),function(x['colA3'])]), axis=1).rename({0:'colA1',1:'colA2',2:'colA3'}, axis=1)

输出

   colA1  colA2  colA3
0  <= 10   > 10   > 10
1  <= 10  <= 10   > 10
2  <= 10   > 10   > 10
3   > 10   > 10   > 10
4  <= 10  <= 10  <= 10