python - 带有MultiIndex DataFrame的fillna的Pandas SettingWithCopyWarning
问题描述
带有的行fillna()
会引发警告,即使它没有就地执行。这是为什么?
import pandas as pd
import numpy as np
tuples = [('foo', 1), ('foo', 2), ('bar', 1), ('bar', 2)]
index = pd.MultiIndex.from_tuples(tuples)
df = pd.DataFrame(np.random.randn(2, 4), columns=index)
df.loc[0, ('foo', 1)] = np.nan
# this works without warning
# df = pd.DataFrame({'foo': [1, np.nan, 3], 'bar': [np.nan, 22, 33]]})
df1 = df[['foo', 'bar']]
# df1 = df[['foo', 'bar']].copy() # this does not help
filled = df1.fillna({'foo': 100, 'bar': 200}, inplace=False)
foo
如果和bar
是普通列,而不是多索引,则不会出现问题。
解决方案
这是一个误报,不应该在这里提出警告。我认为问题在于fillna
不理解“foo”和“bar”适用于 MultiIndex 列的特定级别。
我建议在实现此功能之前调用fillna
内部GroupBy
作为解决方法。
fill = {'foo': 100, 'bar': 200}
df1.groupby(level=0, axis=1).apply(lambda x: x.fillna(fill[x.name]))
foo bar
1 2 1 2
0 100.000000 1.040531 -1.516983 -0.866276
1 -0.055035 -0.107310 1.365467 -0.097696
或者,要fillna
直接使用,请指定元组的字典(因为,MultiIndex),
df1.fillna({('foo', 1): 100, ('foo', 2): 100})
foo bar
1 2 1 2
0 100.000000 1.040531 -1.516983 -0.866276
1 -0.055035 -0.107310 1.365467 -0.097696
推荐阅读
- javascript - 节点中的事件流:在控制台中工作正常但不写入流
- javascript - 如何在 Laravel/Vue.js 项目中使用 Vuesax 上传组件?
- recursion - 如何在递归调用中使用迭代器来改变数据序列?
- reactjs - 如何在 React-Redux-Firebase 中更新 firestoreConnect(使用监听器)?
- android - 获取:Fabric 无法初始化,AndroidManifest.xml 中缺少 API 密钥,而我有带有 apiKey 的 fabric.properties
- excel - 将多列/行合并为一列/行
- javascript - width 和 style.width 接受哪些数据类型?
- python - FileNotFoundError: [Errno 2] No such file or directory: get file from a folder macbook
- python - Django DRF 使用 CreateListModelMixin 更改序列化程序数据
- bash - 如何在 shell 脚本的 virtualenv 中运行命令