python - 根据多列条件替换 Pandas 中的 NaN
问题描述
我希望你做得很好。
我需要帮助才能对我的数据框执行复杂的“NaN 替换”。
根据其他列过滤的其他列值的模式,替换熊猫列中的 NaN 值的最佳方法是什么?
让我说明我的问题:
import random
import numpy as np
import pandas as pd
data = {'Region': [1,1,1,2,2,2,1,2,2,2,2,1,1,1,2,1], 'Country': ['a','a', 'a', 'a', 'a','a', 'a', 'a', 'b', 'b', 'b', 'b','b','b','b','b'], 'GDP' : [100,100,101,105,105,110,np.nan,np.nan,200,200,100,150,100,150,np.nan,np.nan]}
df = pd.DataFrame.from_dict(data)
东风:
Region Country GDP
0 1 a 100.0
1 1 a 100.0
2 1 a 101.0
3 2 a 105.0
4 2 a 105.0
5 2 a 110.0
6 1 a NaN
7 2 a NaN
8 2 b 200.0
9 2 b 200.0
10 2 b 100.0
11 1 b 150.0
12 1 b 100.0
13 1 b 150.0
14 2 b NaN
15 1 b NaN
我想用同一国家和地区的其他 GDP 值的模式替换 GDP 列的 nan 值。
对于索引 6 的 GDP 列的 NaN 值,我希望将其替换为 100(因为它是区域 1 和国家 a 的 GDP 值的模式)
所需的输出应如下所示:
Region Country GDP
0 1 a 100
1 1 a 100
2 1 a 101
3 2 a 105
4 2 a 105
5 2 a 110
6 1 a 100
7 2 a 105
8 2 b 200
9 2 b 200
10 2 b 100
11 1 b 150
12 1 b 100
13 1 b 150
14 2 b 200
15 1 b 150
谢谢你的帮助,我希望你有一个美好的一天!
解决方案
Pandasfillna
允许填充另一个系列的缺失值。因此,我们需要另一个系列,其中包含相应索引处每个国家/地区的模式。
为了得到这个系列,我们可以使用 Pandas 的groupby().transform()
操作。它将数据帧分组,然后将结果广播回原始形状。
如果我们按原样使用此操作mode
,则会出错。Mode 可以返回多个值,防止 pandas 将值广播回原始形状。所以我们需要强制它返回一个值,所以只需选择第一个(或最后一个,或任何一个)。
df["GDP"].fillna(
df.groupby(["Country", "Region"])["GDP"].transform(
lambda x: x.mode()[0]
)
)
推荐阅读
- reactjs - 使用 react i18n 部署我的 React 应用程序会在 locales.json 上引发 404 错误
- python - 为什么 Sonic Visualizer 和我的 Python 脚本之间的频谱分析存在 dB 差异?
- c - 如果在控制台上按下右键
- ansible - Ansible 在某些播放中无法连接到主机
- python - 如何创建每个 datframe 单元格具有多个值的 seaborn 散点图
- python - 与 plotly 交互的 ipywidgets 不会产生绘图
- html - 如何在 bootstrap4 导航栏中对齐社交媒体图标及其工具提示?
- mysql - SQL 语句根据其他列中的值命名列
- haskell - Haskell SendFile 零拷贝 - 中止传输
- android - 调用 ACTION_CALL 意图时解锁 android 设备不工作