猿问

如果有两个具有相同键的不同值,如何更改数据框单元格中的值

我正在用 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 行,我正在寻找更充分的答案。


月关宝盒
浏览 150回答 1
1回答

牧羊人nacy

使用GroupBy.transformwithDataFrameGroupBy.nunique测试唯一值的数量并按条件设置新值DataFrame.loc:df.loc[df.groupby('col2')['col3'].transform('nunique') != 1, 'col3'] = 'A' print (df)  col1  col2 col30    a     1    A1    b     2    A2    c     2    A3    d     2    A4    e     3    B5    f     3    B详情:首先检查每个组的唯一值数量,其transform大小与原始 DataFrame 相同:print (df.groupby('col2')['col3'].transform('nunique'))0    11    22    23    24    15    1Name: col3, dtype: int64然后测试不相等:print (df.groupby('col2')['col3'].transform('nunique') != 1)0    False1     True2     True3     True4    False5    FalseName: col3, dtype: bool最后按值覆盖True行A。
随时随地看视频慕课网APP

相关分类

Python
我要回答