清理相邻列中的 Python 数据

Python data clean in adjacent columns

提问人:Steve 提问时间:11/14/2023 最后编辑:BarmarSteve 更新时间:11/14/2023 访问量:32

问:

我有一个数据帧,其中“类型”列中的某些值不正确:

编号 类型 其他数据
美国广播公司 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 上。

Python pandas 数据帧 重复项

评论

0赞 Barmar 11/14/2023
您可以使用左连接/合并来执行此操作。
0赞 Barmar 11/14/2023
如果有多行具有相同的 ID 和不同的类型怎么办?
0赞 Steve 11/15/2023
Corralien 的答案解决了这个问题——这是一个很好的答案。它没有考虑不同类型的场景,但在这个场景中,只有一个实值或一个错误值;挑战在于将错误解析为另一种“正确”类型。
0赞 Barmar 11/15/2023
我们仍然希望海报展示他们尝试过的东西。我们在这里帮助您修复代码,而不是为您做整个事情。
0赞 Steve 11/15/2023
嗨,Bramar,感谢您的评论,是的,我很惭愧没有粘贴代码,但我尝试了很多事情,但没有正确的策略,我需要掩码的想法 - 我有一本包含数据的字典,只是无法弄清楚如何在没有循环的情况下将其应用于整个数据集 - 这在数据大小上是不切实际的。谢谢你把我拉上来 - 我会努力尽可能多地获取代码示例。

答:

0赞 Corralien 11/14/2023 #1

您可以使用布尔掩码隐藏等于 0 的行,然后分组依据并将最大值(除 之外的任何其他值)广播到所有行:TypeNaN

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
这是完美的。使用面具产生了一套全新的想法。谢谢。