使用部分映射更新 pandas DataFrame 的列

Posted

技术标签:

【中文标题】使用部分映射更新 pandas DataFrame 的列【英文标题】:Update a column of a pandas DataFrame using a partial map 【发布时间】:2017-08-12 20:19:59 【问题描述】:

我有一个包含许多列的大型 DataFrame。我还有一个带有两列的较小 DataFrame - 称它们为“标签”和“值”,它们都在较大的 DataFrame 中。我想用较小 DataFrame 的 'value' 列替换较大 DataFrame 的 'value' 列,对于较大 DataFrame 的行,其中 'label' 与较小 DataFrame 中的行匹配。

for 循环的逻辑是:

largeDF = pd.DataFrame([['a',1],['b',2],['c',3],['d',4],['e',5]], columns=['label','value']).set_index('label')
smallDF = pd.DataFrame([['d',6],['e',7]], columns=['label','value']).set_index('label')
for label in smallDF.index:
    largeDF.loc[label,'value'] = smallDF.loc[label,'value']

不幸的是

的明显答案
largeDF['value'] = smallDF['value']

不起作用,因为它会对不在小 DF 中的标签进行 NaN。使用 .map() 也有类似的问题。

我正在使用的 for 循环似乎非常不合 Python,unpandas 和缓慢。我想念的更好的方法是什么?

【问题讨论】:

【参考方案1】:

你可以使用combine_first:

print (smallDF['value'].combine_first(largeDF['value']))
label
a    1.0
b    2.0
c    3.0
d    6.0
e    7.0
Name: value, dtype: float64

大家一起:

largeDF = pd.DataFrame([['a',1],['b',2],['c',3],['d',4],['e',5]], columns=['label','value'])
            .set_index('label')
largeDF['a'] = 1
largeDF['b'] = 'f'
smallDF = pd.DataFrame([['d',6],['e',7]], columns=['label','value']).set_index('label')
print (largeDF)
       value  a  b
label             
a          1  1  f
b          2  1  f
c          3  1  f
d          4  1  f
e          5  1  f

print (smallDF)
       value
label       
d          6
e          7

largeDF['value'] = smallDF['value'].combine_first(largeDF['value']).astype(int)
print (largeDF)
       value  a  b
label             
a          1  1  f
b          2  1  f
c          3  1  f
d          6  1  f
e          7  1  f

【讨论】:

以上是关于使用部分映射更新 pandas DataFrame 的列的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用notnull函数和astype函数将dataframe中所有缺失值映射为0,非缺失值映射为1

Pandas DataFrame 函数应用和映射

Pandas映射(转化)dataframe中的布尔值True和False值到1和0数值使用astype函数

使用另一个 pandas DataFrame 更新存储在 Pytable 中的 pandas DataFrame

pandas使用notnull函数将dataframe中所有缺失值映射为False,非缺失值映射为True(map missing vlaues into False others into True

映射 str.contains 跨 pandas DataFrame