基于列的熊猫多条件函数

时间:2015-03-07 03:09:38

标签: python pandas

尝试找到最优雅的方法,将非常简单的转换应用于不同列中的值,每列都有自己的条件。所以给定一个像这样的数据框:

   A      B      C  D    E     F
0  1 2013-01-02  1  3   test  foo
1  1 2013-01-02  1  3  train  foo
2  1 2013-01-02  1  3   test  foo
3  1 2013-01-02  1  3  train  foo

只想拥有一个仅在第二列具有特定值时才会调整每列中的值的函数。换句话说......

df['C'] = -1 if df['E'] == "test" else df['C'] next column...
df['D'] = -2 if df['E'] == "test" else df['D'] and so forth.

我在想大熊猫的哪个功能在这里会派上用场,但不知道如何应用它。我可以在下面做,但似乎效率不高,我必须为每个col创建一个不同的函数:

def col(df):
    if df['col1'] == "value":
        return -1.00
    else:
        return relative_buckets['col1']

1 个答案:

答案 0 :(得分:1)

您可以将.loc与布尔系列一起使用:

>>> df
   A           B  C  D      E    F
0  1  2013-01-02  1  3   test  foo
1  1  2013-01-02  1  3  train  foo
2  1  2013-01-02  1  3   test  foo
3  1  2013-01-02  1  3  train  foo
>>> df.loc[df.E == "test", "C"] = -1
>>> df
   A           B  C  D      E    F
0  1  2013-01-02 -1  3   test  foo
1  1  2013-01-02  1  3  train  foo
2  1  2013-01-02 -1  3   test  foo
3  1  2013-01-02  1  3  train  foo

使用.loc比尝试直接影响列更受欢迎,因为视图与副本问题有关(有关详细信息,请参阅here。)

如果您想一次更改多个列,也可以这样做:

>>> df.loc[df.E == "test", ["C","D"]] = [888, 999]
>>> df
   A           B    C    D      E    F
0  1  2013-01-02  888  999   test  foo
1  1  2013-01-02    1    3  train  foo
2  1  2013-01-02  888  999   test  foo
3  1  2013-01-02    1    3  train  foo