提问人:Steve 提问时间:11/14/2023 最后编辑:BarmarSteve 更新时间:11/14/2023 访问量:32
清理相邻列中的 Python 数据
Python data clean in adjacent columns
问:
我有一个数据帧,其中“类型”列中的某些值不正确:
编号 | 类型 | 其他数据 |
---|---|---|
美国广播公司 | 10.0 | 56 |
美国广播公司 | 10.0 | 34 |
美国广播公司 | 0.0 | 78 |
DEF的 | 20.0 | 45 |
DEF的 | 0.0 | 23 |
ZWS系列 | 20.0 | 99 |
TYH公司 | 10.0 | 12 |
TYH公司 | 10.0 | 63 |
FCE公司 | 0.0 | 56 |
FCE公司 | 20.0 | 78 |
XSA系列 | 10.0 | 74 |
红 | 0.0 | 55 |
QWA公司 | 20.0 | 74 |
我想遍历每个 ID 并确定 Type 是否等于 0.0,然后将其替换为同一 id 的值不是 0.0 的行中的值。 如果没有其他具有 ID 的行,并且 type 列中的 ID 为 0.0,则将其更改为 Nan 或 99,以便以后可以将其删除。
结果将是: 第 3 行的 ABC 更改为 10.0 第 5 行的 DEF 更改为 20.0 第 9 行的 FCE 更改为 20.0 第 12 行的 RED 更改为 Nan 或 99,因为未找到等效匹配项。
解决这个问题的最佳方法是什么?
我尝试过构建字典和循环,但我一直卡在替换等效键值的 0.0 上。
答:
0赞
Corralien
11/14/2023
#1
您可以使用布尔掩码隐藏等于 0 的行,然后分组依据并将最大值(除 之外的任何其他值)广播到所有行:Type
NaN
m = df['Type'].eq(0) # boolean mask
df['New Type'] = df['Type'].mask(m).groupby(df['ID']).transform('max')
print(df)
# Output
ID Type Other Data New Type
0 ABC 10.0 56 10.0
1 ABC 10.0 34 10.0
2 ABC 0.0 78 10.0 # 0.0 -> 10.0
3 DEF 20.0 45 20.0
4 DEF 0.0 23 20.0 # 0.0 -> 20.0
5 ZWS 20.0 99 20.0
6 TYH 10.0 12 10.0
7 TYH 10.0 63 10.0
8 FCE 0.0 56 20.0 # 0.0 -> 20.0
9 FCE 20.0 78 20.0
10 XSA 10.0 74 10.0
11 RED 0.0 55 NaN # 0.0 -> NaN
12 QWA 20.0 74 20.0
评论
0赞
Steve
11/15/2023
这是完美的。使用面具产生了一套全新的想法。谢谢。
评论