使用部分映射更新 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中的布尔值True和False值到1和0数值使用astype函数
使用另一个 pandas DataFrame 更新存储在 Pytable 中的 pandas DataFrame
pandas使用notnull函数将dataframe中所有缺失值映射为False,非缺失值映射为True(map missing vlaues into False others into True