尝试将 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 表
如何将 python 对象(如字典)分配给 pandas 列