尝试找到最优雅的方法,将非常简单的转换应用于不同列中的值,每列都有自己的条件。所以给定一个像这样的数据框:
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']
答案 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