尝试将 ID 分配给 pandas DataFrame 中的对,得到不一致的结果

Posted

技术标签:

【中文标题】尝试将 ID 分配给 pandas DataFrame 中的对,得到不一致的结果【英文标题】:Trying to assign IDs to pairs in a pandas DataFrame, getting inconsistent results 【发布时间】:2020-10-27 16:25:56 【问题描述】:

我有一个 df:

df = pd.DataFrame('src':['LV','LA','NC','NY','ABC','XYZ'], 'dest':['NC','NY','LV','LA','XYZ','ABC'], 'dummy':[1,3,6,7,8,10])
src   dest   dummy
LV      NC       1
LA      NY       3
NC      LV       6
NY      LA       7
ABC     XYZ      8
XYZ     ABC     10

我通过了:

df['pair'] = df[['src', 'dest']].apply(lambda x : tuple(set(x)), 1).factorize()[0] + 1

尝试关闭唯一的对,例如 (a->b, b->a)

我正确地结束了这个:

src   dest   dummy  pair
LV      NC       1     1
LA      NY       3     2
NC      LV       6     1
NY      LA       7     2
ABC     XYZ      8     3
XYZ     ABC     10     3

但是,有时当我运行它时,我最终会出现以下错误:

 src   dest   dummy  pair
LV      NC       1     1
LA      NY       3     2
NC      LV       6     1
NY      LA       7     2
ABC     XYZ      8     3
XYZ     ABC     10     4

如您所见,由于某种原因,最后一个元素没有正确锁定为“3”对。这是随机发生的。我可以通过注释掉“配对关闭”代码,运行脚本来制作和打印 df,然后取消注释并重试来重现这一点。您可以通过运行其他修改以其他方式重现此情况。

如何解决这种不确定的行为?

【问题讨论】:

【参考方案1】:

试试set的问题,你可以改成frozenset

df['pair'] = pd.DataFrame(np.sort(df[['src','dest']].values,1)).agg(tuple,1).factorize()[0]+1
Out[108]: array([1, 2, 1, 2, 3, 3], dtype=int64)

【讨论】:

谢谢!上面代码中究竟在哪里使用了frozenset? @reeeeeeeeeeee 我的意思是修复了你的代码df['pair'] = df[['src', 'dest']].apply(lambda x : tuple(frozenset(x)), 1).factorize()[0] + 1

以上是关于尝试将 ID 分配给 pandas DataFrame 中的对,得到不一致的结果的主要内容,如果未能解决你的问题,请参考以下文章

“未指定驱动程序名称”将 pandas 数据帧写入 SQL Server 表

使用查询将np.nans分配给Pandas列的行

如何将 python 对象(如字典)分配给 pandas 列

如何在函数内将变量分配给合并的 Pandas 数据框

Python Pandas:将 DataFrame 组的最后一个值分配给该组的所有条目

将尚未分配的 ID 分配给新实体