【问题标题】:Pandas: modify cell values using method chainingPandas:使用方法链接修改单元格值
【发布时间】:2016-10-27 15:09:28
【问题描述】:
>>> df
  a b c ...
0 1 2
1 3 4
. ... 

我希望 b 列加倍。 这个方法我知道

>>> df['b'] *= 2

我可以在方法链样式中做到这一点吗?我想更可爱! 像这样。

>>> (df.drop('c', 1)
       .someMethodToReplaceBColumnValues())

我有很多清理数据的方法,这是其中的一种操作,我被困在了这里。 我遇到过,replaceset_value 等。但我不知道怎么做。

我也尝试了apply 方法,但它只返回应用了操作的列。所以我只得到了带有 apply 方法的 b 列。如何进一步接近?

【问题讨论】:

    标签: python pandas apply assign chaining


    【解决方案1】:

    你可以试试assign:

    df = pd.DataFrame({'a':[1,2,3],
                       'b':[4,5,6],
                       'c':[7,8,9]})
    
    print (df)
       a  b  c
    0  1  4  7
    1  2  5  8
    2  3  6  9
    
    print (df.drop('c', 1).assign(b=df.b*2))
       a   b
    0  1   8
    1  2  10
    2  3  12
    

    print (df.drop('c', 1).apply(lambda x: x * 2 if x.name == 'b' else x))
       a   b
    0  1   8
    1  2  10
    2  3  12
    

    【讨论】:

    • 列名有空格怎么办?
    • 不幸的是assign 不能在列名中使用空格。所以我添加了lambdaapply 的替代解决方案。
    • 太棒了,这就是我想要的。我知道apply 会是正确的选择,但不知道如何正确使用它。谢谢。
    • @jezrael 您可以将语句放入 dict 和 df.assign(**statements) 以添加/覆盖名称中包含空格或其他奇怪字符的列。
    • @Maven - 如果需要assign 空间使用a = {'col space': df['col space'] * 2} 然后print (df.assign(**a))
    【解决方案2】:

    您可以使用 apply 和自定义函数:

    def mult(x, columns):
        if x.name in columns:
            return x*2
        else:
            return x
    
    print df.apply(mult, args=(['b', 'c'],))
    
       a   b  c
    0  0   0  0
    1  1   2  2
    2  2   4  4
    

    请注意您将元组作为额外参数传递给 apply 中的函数!

    【讨论】:

    • 这是一个很好的解决方案。提供清晰的代码。我们可以用 lambda 代替吗?
    • 谢谢 Niels,我从 @jezrael 得到了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 2015-11-12
    • 1970-01-01
    • 2016-12-26
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多