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

RDJ*_*RDJ 2 python pandas

假设这是我的功能:

def function(x):
    return x.str.lower()
Run Code Online (Sandbox Code Playgroud)

这是我的 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
Run Code Online (Sandbox Code Playgroud)

我想将该函数仅应用于列BD. (将它应用于完整的 DataFrame 不是答案,因为它会在数字列中产生 NaN 值)。

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

但我无法理解如何选择不同的列来应用该函数。我已经尝试过按数字位置、名称等进行索引的所有方式。

我花了很多时间来阅读这个。这不是以下任何一项的直接副本:

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

Pandas:如何对多列使用应用函数

Pandas:对不同的列应用不同的功能

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

EdC*_*ica 8

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

df[['B','D']].apply(function)
Run Code Online (Sandbox Code Playgroud)

这将针对每一列运行您的 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
Run Code Online (Sandbox Code Playgroud)

您还可以过滤 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
Run Code Online (Sandbox Code Playgroud)

时间安排

按列与按行:

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
Run Code Online (Sandbox Code Playgroud)

然而,对于显着更大的 dfs(按行),第一种方法会更好地扩展