熊猫:如何将函数应用于不同的列


问题内容

假设这是我的功能:

def function(x):
    return x.str.lower()

这是我的DataFrame(df)

   A         B     C       D 
0  1.67430   BAR  0.34380  FOO 
1  2.16323   FOO -2.04643  BAR
2  0.19911   BAR -0.45805  FOO
3  0.91864   BAR -0.00718  BAR
4  1.33683   FOO  0.53429  FOO
5  0.97684   BAR -0.77363  BAR

我想将此功能仅应用于列BD。(将其应用于完整的DataFrame并不是答案,因为这会在数字列中产生NaN值)。

这是我的基本想法: df.apply(function, axis=1)

但是我无法理解如何选择不同的列来应用该功能。我尝试了通过数字位置,名称等进行所有索引的方式。

我花了很多时间阅读此内容。这不是以下任何一项的直接重复:

如何将函数应用于Pandas数据框的两列

熊猫:如何使用套用功能至多栏

熊猫:将不同的功能应用于不同的列

Python Pandas:使用“
apply”将1个函数应用于多个列


问题答案:

只需从df中选择列,通过忽略axis参数,我们将按列而不是按行进行操作,这将非常重要,因为此处的行数多于列数:

df[['B','D']].apply(function)

这将对每个列运行您的func

In [186]:
df[['B','D']].apply(function)

Out[186]:
     B    D
0  bar  foo
1  foo  bar
2  bar  foo
3  bar  bar
4  foo  foo
5  bar  bar

您还可以过滤df以仅获取字符串dtype列:

In [189]:
df.select_dtypes(include=['object']).apply(function)

Out[189]:
     B    D
0  bar  foo
1  foo  bar
2  bar  foo
3  bar  bar
4  foo  foo
5  bar  bar

时机

按列与按行:

In [194]:    
%timeit df.select_dtypes(include=['object']).apply(function, axis=1)
%timeit df.select_dtypes(include=['object']).apply(function)

100 loops, best of 3: 3.42 ms per loop
100 loops, best of 3: 2.37 ms per loop

但是,对于较大的dfs(逐行),第一种方法的伸缩性会好得多