【问题标题】:How to modify a pandas dataframe using broadcasting series on a subset of columns如何在列的子集上使用广播系列修改熊猫数据框
【发布时间】:2019-02-11 19:42:08
【问题描述】:

给定下表:

 import numpy as np
 import pandas as pd
 data = pd.DataFrame(data = np.arange(16).reshape((4, 4)),
                     index = ['Chile', 'Argentina', 'Peru', 'Bolivia'],
                     columns = ['one', 'two', 'three', 'four'])


           one  two three  four
 Chile      0    1   2      3
 Argentina  4    5   6      7
 Peru       8    9   10     11
 Bolivia    12   13  14     15

我想通过在将修改(更新)表的列子集(onethree)上广播熊猫系列来应用操作。所以..

ser_to_broad = pd.Series([1, 2], index = ['one', 'three'])
data + ser_to_broad

           one  two three  four
Chile       1   NaN   4     NaN
Argentina   5   NaN   8     NaN    
Peru        9   NaN   12    NaN    
Bolivia     13  NaN   16    NaN 

有没有一种方法可以使用广播方法来保留列 twofour 的原始值?

【问题讨论】:

  • 所以你想更新data
  • 是的,想法是通过操作改变表

标签: python pandas dataframe broadcasting


【解决方案1】:

如果你想更新数据,我认为可以这样做:

ser_to_broad = pd.Series([1, 2], index=['one', 'three'])
data[ser_to_broad.index] += ser_to_broad

print(data)

输出

           one  two  three  four
Chile        1    1      4     3
Argentina    5    5      8     7
Peru         9    9     12    11
Bolivia     13   13     16    15

【讨论】:

  • 这个答案更通用,因为它不需要中和其他列中的操作,用值填充系列。我唯一的问题是,考虑到切片操作,广播操作更难阅读。
【解决方案2】:

reindex做,因为ser_to_broad中有miss列,所以会返回NaN(NaN + somevalue=NaN)

data+ser_to_broad.reindex(data.columns,fill_value=0)
Out[106]: 
           one  two  three  four
Chile        1    1      4     3
Argentina    5    5      8     7
Peru         9    9     12    11
Bolivia     13   13     16    15

【讨论】:

  • 看起来你应该能够使用 .add 来做到这一点,但它的 NotImplemented:
  • 好方法。确实,@AndyHayden 我认为 .add 已经处理了这些情况
  • @AndyHayden 我首先想到的是add,但是,似乎不支持这种情况。
  • @Wen-Ben 您的方法的一个问题是,需要用一个值填充系列,以中和列twofour 中的操作。例如,如果操作而不是 data + serdata * ser,我们需要用一个填充系列。
  • @CristóbalAlcázar 是的,这是正确的,不同的操作可能需要不同的填充
猜你喜欢
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
  • 2017-02-09
  • 1970-01-01
相关资源
最近更新 更多