Python 具有多索引替换的Groupby
对于给定日期,我如何用美国值替换缺失的英国值?需要通用代码Python 具有多索引替换的Groupby,python,python-3.x,pandas,Python,Python 3.x,Pandas,对于给定日期,我如何用美国值替换缺失的英国值?需要通用代码 df value country date uk 2016-01-01 NaN 2016-01-08 5.0 us 2016-01-01 21.0 2016-01-08 1.5 don't touch
df
value
country date
uk 2016-01-01 NaN
2016-01-08 5.0
us 2016-01-01 21.0
2016-01-08 1.5
don't touch 2016-01-01 44.0
2016-01-08 44.5
预期产量
value
country date
uk 2016-01-01 21.0
2016-01-08 5.0
us 2016-01-01 21.0
2016-01-08 1.5
don't touch 2016-01-01 44.0
2016-01-08 44.5
您可以按列表选择以避免删除
多索引
,并使用正确的对齐方式重命名
:
df.loc[['uk']] = df.loc[['uk']].fillna(df.loc[['us']].rename({'us':'uk'}))
print (df)
value
country date
uk 2016-01-01 21.0
2016-01-08 5.0
us 2016-01-01 21.0
2016-01-08 1.5
don't touch 2016-01-01 44.0
2016-01-08 44.5
或重塑为、替换为行和重塑为后:
df = df.unstack()
df.loc['uk'] = df.loc['uk'].fillna(df.loc['us'])
df = df.stack()
编辑:如果只想使用所有
NaN
s的解决方案,则测试其标量True
或False
:
print (df)
value
country date
uk 2016-01-01 NaN
2016-01-08 NAN
us 2016-01-01 21.0
2016-01-08 1.5
don't touch 2016-01-01 44.0
2016-01-08 44.5
df = df.unstack()
print (df)
value
date 2016-01-01 2016-01-08
country
don't touch 44.0 44.5
uk NaN NAN
us 21.0 1.5
非常感谢@jezrael。如果我想保留multiindex,但仅当整个列为NaN(英国)时才替换值,您会添加掩码条件吗?@asd-添加到答案中。
print (df)
value
country date
uk 2016-01-01 NaN
2016-01-08 NAN
us 2016-01-01 21.0
2016-01-08 1.5
don't touch 2016-01-01 44.0
2016-01-08 44.5
df = df.unstack()
print (df)
value
date 2016-01-01 2016-01-08
country
don't touch 44.0 44.5
uk NaN NAN
us 21.0 1.5
test = df.loc['uk'].isna().all()
print (test)
True
if test:
df.loc['uk'] = df.loc['uk'].fillna(df.loc['us'])
df = df.stack(dropna=False)
print (df)
value
country date
don't touch 2016-01-01 44.0
2016-01-08 44.5
uk 2016-01-01 21.0
2016-01-08 1.5
us 2016-01-01 21.0
2016-01-08 1.5