我正在用 Python 编写脚本,我正在寻找以下问题的最佳解决方案:我有大熊猫数据框(至少 100k 行),如果 col2 中存在具有相同值但 col3 中值不同的行,那么我想将 col3 中的所有值更改为 A例如:----------------------| col1 | col2 | col3 |----------------------| a | 1 | A |----------------------| b | 2 | A |----------------------| c | 2 | B |----------------------| d | 2 | B |----------------------| e | 3 | B |----------------------| f | 3 | B |----------------------应该是这样的:----------------------| col1 | col2 | col3 |----------------------| a | 1 | A |----------------------| b | 2 | A |----------------------| c | 2 | A |----------------------| d | 2 | A |----------------------| e | 3 | B |----------------------| f | 3 | B |----------------------我通过在 col2 上对数据帧进行排序并遍历行来解决这个问题,每当 col2 中的值发生变化并且相同 col2 值的“块”中的值是不同的值时,我会更改 col3 值,但是这个算法需要大约 60 秒来处理 100k 行,我正在寻找更充分的答案。
1 回答
牧羊人nacy
TA贡献1862条经验 获得超7个赞
使用GroupBy.transformwithDataFrameGroupBy.nunique测试唯一值的数量并按条件设置新值DataFrame.loc:
df.loc[df.groupby('col2')['col3'].transform('nunique') != 1, 'col3'] = 'A'
print (df)
col1 col2 col3
0 a 1 A
1 b 2 A
2 c 2 A
3 d 2 A
4 e 3 B
5 f 3 B
详情:
首先检查每个组的唯一值数量,其transform大小与原始 DataFrame 相同:
print (df.groupby('col2')['col3'].transform('nunique'))
0 1
1 2
2 2
3 2
4 1
5 1
Name: col3, dtype: int64
然后测试不相等:
print (df.groupby('col2')['col3'].transform('nunique') != 1)
0 False
1 True
2 True
3 True
4 False
5 False
Name: col3, dtype: bool
最后按值覆盖True行A。
添加回答
举报
0/150
提交
取消