【问题标题】:How can I conditionally update multiple columns in a panda dataframe如何有条件地更新熊猫数据框中的多个列
【发布时间】:2016-10-07 03:35:40
【问题描述】:

我正在尝试有条件地更新我的熊猫数据框中的多行。这是我的数据:

df = pd.DataFrame([[1,1,1], [2,2,2], [3,3,3]], columns=list('ABC'))

我可以分两步完成我想要的更新:

df.loc[df['A'] == 1, 'B'] = df['C'] +10
df.loc[df['A'] == 1, 'A'] = df['C'] +11

或者我可以一步更新为常数值:

df.loc[df['A'] == 1, ['A', 'B']] = [11, 12]

但我无法一步更新其他列中的多个列:

df.loc[df['A'] == 1, ['A', 'B']] = [df['C'] + 10, df['C'] + 11]
...
ValueError: shape mismatch: value array of shape (2,3) could not be broadcast to indexing result of shape (1,2)

有什么想法可以做到这一点吗?


编辑:感谢@EdChum 为简单案例提供简单的解决方案 - 已更新问题以展示更复杂的现实。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    所以几年后再看这个问题,我看到了错误,要强制返回结果以便正确分配,您需要访问标量值并使用这些值进行分配,以便它们按需要对齐:

    In [22]:
    df.loc[df['A'] == 1, ['A', 'B']] = df['C'].values[0] + 10,df['C'].values[0] + 11
    df
    
    Out[22]:
        A   B  C
    0  11  12  1
    1   2   2  2
    2   3   3  3
    

    【讨论】:

      【解决方案2】:

      我不确定这是否是实现这一目标的最佳方式,但它确实有效:

      In [284]: df.loc[df['A'] == 1, ['A', 'B']] = pd.DataFrame({'A':df.C + 10, 'B':df.C + 11}, index=df.index)
      
      In [285]: df
      Out[285]:
          A   B  C
      0  11  12  1
      1   2   2  2
      2   3   3  3
      

      【讨论】:

        猜你喜欢
        • 2018-04-15
        • 1970-01-01
        • 2020-01-15
        • 2019-08-29
        • 1970-01-01
        • 2020-04-23
        相关资源
        最近更新 更多