python - 将 DataFrame 行中的 NaN 值替换为基于(非唯一)列值的其他行中的值
问题描述
我有一个类似于以下内容的 DataFrame,其中我有一列具有非唯一值(在本例中为地址)以及其他一些包含有关它的信息的列。
df = pd.DataFrame({'address': {0:'11 Star Street', 1:'22 Milky Way', 2:'88 Dark Drive', 3:'33 Planet Place', 4:'22 Milky Way', 5:'22 Milky Way'}, 'val': {0:10, 1:'', 2:'', 3:20, 4: 20, 5:''}, 'val2': {0:20, 1:'', 2:'', 3:40, 4:10, 5:''}})
address val val2
0 11 Star Street 10 20
1 22 Milky Way
2 88 Dark Drive
3 33 Planet Place 20 40
4 22 Milky Way 20 10
5 22 Milky Way
一些地址在 DataFrame 中出现不止一次,而其中一些重复的地址缺少信息。如果某行缺少值,但该地址出现在 DataFrame 的另一行中,我想将 NaN 值替换为来自同一地址的值,以获得如下结果:
address val val2
0 11 Star Street 10 20
1 22 Milky Way 20 10
2 88 Dark Drive
3 33 Planet Place 20 40
4 22 Milky Way 20 10
5 22 Milky Way 20 10
使用字典之类的东西是不可行的,因为 DataFrame 包含数千个不同的地址。
编辑:可以安全地假设两个值都丢失或两者都存在。换句话说,永远不会有只有 val 而不是 val2 的行,反之亦然。但是,可以将这种可能的情况考虑在内的答案会更好!
解决方案
有多种方法可以做到这一点,最简单的是 groupby 和 ffill / bfill 组。
import numpy as np
import pandas as pd
df = df.replace('',np.nan,regex=True).groupby('address').apply(lambda x : x.ffill().bfill())
print(df)
address val val2
0 11 Star Street 10.0 20.0
1 22 Milky Way 20.0 10.0
2 88 Dark Drive NaN NaN
3 33 Planet Place 20.0 40.0
4 22 Milky Way 20.0 10.0
5 22 Milky Way 20.0 10.0
另一种更高效的方法是update
沿您的轴使用。
vals = df.replace('',np.nan,regex=True).groupby('address').first()
print(vals)
val val2
address
11 Star Street 10.0 20.0
22 Milky Way 20.0 10.0
33 Planet Place 20.0 40.0
88 Dark Drive NaN NaN
df = df.set_index('address')
df.update(vals)
val val2
address
11 Star Street 10 20
22 Milky Way 20 10
88 Dark Drive
33 Planet Place 20 40
22 Milky Way 20 10
22 Milky Way 20 10
推荐阅读
- javascript - ReactJS + D3:解析本地 CSV 文件并使用 d3-request 将其传递给状态
- mongodb - 如何找到空的使用mongodb?
- php - Dynamic insert the template to the base template
- python - Loop through url-list in python
- python - Firefox 不保存带有扩展名的文件
- keyboard-events - Interaction with a running process
- c# - GroupPrincipal.FindByIdentity 未获取最新的 AD 组
- node.js - node.js 中间件使代码同步
- odoo - 未捕获的类型错误:无法读取未定义的属性“类型”
- bash - 当使用 SIGINT 杀死父进程时,子进程如何终止?