Python 如何使用列子集上的广播系列修改数据帧

Python 如何使用列子集上的广播系列修改数据帧,python,pandas,dataframe,broadcasting,Python,Pandas,Dataframe,Broadcasting,鉴于下表: 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'])

鉴于下表:

 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
我希望通过在列的子集(
1
3
)上广播熊猫系列来应用操作,这些列将修改(更新)表。所以

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 

有没有一种方法可以通过广播方式保留列
two
four
的原始值?

使用
reindex
,因为
seru to_broad
中有漏列,那么它将返回
NaN
NaN
+somevalue=
NaN


使用
reindex
,由于
seru to_broad
中存在未命中列,因此它将返回
NaN
NaN
+somevalue=
NaN


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

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

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

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

它看起来像是你应该能够用它来做这件事。添加但它没有实现:好方法。的确如此,@AndyHayden我认为。add已经处理了这些问题situation@AndyHayden然而,我想到的第一件事是添加,似乎不支持这种情况。@Wen Ben您的方法的一个问题是需要在序列中填充一个值,该值可以中和列
two
four
中的操作。例如,如果操作不是
data+ser
而是
data*ser
,我们需要用一个来填充序列。@CristóbalAlcázar是的,不同的操作可能需要不同的填充。它看起来好像你应该能够用它来完成。添加但它没有实现:好方法。的确如此,@AndyHayden我认为。add已经处理了这些问题situation@AndyHayden然而,我想到的第一件事是添加,似乎不支持这种情况。@Wen Ben您的方法的一个问题是需要在序列中填充一个值,该值可以中和列
two
four
中的操作。例如,如果操作而不是
data+ser
data*ser
,我们需要用一个来填充序列。@CristóbalAlcázar是的,这是正确的,不同的操作可能需要不同的填充,因此要更新
数据
?是,想法是用操作来改变表格,是否要更新
数据
?是的,想法是用操作来改变表格。这个答案更具普遍性,因为它不需要在用值填充序列的其他列中抵消操作。我唯一的问题是,考虑到切片操作,广播操作更难读取。这个答案更具普遍性,因为它不需要在用值填充序列的其他列中抵消操作。我唯一的问题是,鉴于切片操作,广播操作更难读取。