Python 数据帧解析对行的内部引用
我有一个如下所示的数据框:Python 数据帧解析对行的内部引用,python,pandas,Python,Pandas,我有一个如下所示的数据框: a = [ {'x': 1, 'y': 1, 'q': [], 'obj': 901}, {'x': 1, 'y': 2, 'q': [(3, 3)], 'obj': 907}, {'x': 1, 'y': 3, 'q': [], 'obj': 884}, {'x': 2, 'y': 1, 'q': [(2, 2), (3, 3)], 'obj': 485}, {'x': 2, 'y': 2, 'q': [], 'obj': 8
a = [
{'x': 1, 'y': 1, 'q': [], 'obj': 901},
{'x': 1, 'y': 2, 'q': [(3, 3)], 'obj': 907},
{'x': 1, 'y': 3, 'q': [], 'obj': 884},
{'x': 2, 'y': 1, 'q': [(2, 2), (3, 3)], 'obj': 485},
{'x': 2, 'y': 2, 'q': [], 'obj': 814},
{'x': 2, 'y': 3, 'q': [], 'obj': 491},
{'x': 3, 'y': 1, 'q': [], 'obj': 822},
{'x': 3, 'y': 2, 'q': [], 'obj': 752},
{'x': 3, 'y': 3, 'q': [(1, 3), (2, 1)], 'obj': 739}
]
df = pd.DataFrame(a)
我想添加一个新列,ref
,它是obj
的列表,用于q
中的每个(x,y)
引用。我知道我可以对每一行迭代q
,但这既慢又愚蠢
结果应该是这样的
obj q ref x y
0 901 [] NaN 1 1
1 907 [(3, 3)] [907] 1 2
2 884 [] NaN 1 3
3 485 [(2, 2), (3, 3)] [814, 739] 2 1
4 814 [] NaN 2 2
5 491 [] NaN 2 3
6 822 [] NaN 3 1
7 752 [] NaN 3 2
8 739 [(1, 3), (2, 1)] [884, 485] 3 3
pandaic解决这个问题的方法是什么?不确定pandaic解决这个问题的方法,但迭代会有所帮助
mapping = {(x, y) : z for x, y, z in df[['x', 'y', 'obj']].values.tolist()}
df['refs'] = [
[mapping.get(idx) for idx in idxs] if idxs else np.nan for idxs in df['q']]
obj q x y refs
0 901 [] 1 1 NaN
1 907 [(3, 3)] 1 2 [739]
2 884 [] 1 3 NaN
3 485 [(2, 2), (3, 3)] 2 1 [814, 739]
4 814 [] 2 2 NaN
5 491 [] 2 3 NaN
6 822 [] 3 1 NaN
7 752 [] 3 2 NaN
8 739 [(1, 3), (2, 1)] 3 3 [884, 485]
不确定是否有一种泛泛的方法可以做到这一点,但迭代将有所帮助
mapping = {(x, y) : z for x, y, z in df[['x', 'y', 'obj']].values.tolist()}
df['refs'] = [
[mapping.get(idx) for idx in idxs] if idxs else np.nan for idxs in df['q']]
obj q x y refs
0 901 [] 1 1 NaN
1 907 [(3, 3)] 1 2 [739]
2 884 [] 1 3 NaN
3 485 [(2, 2), (3, 3)] 2 1 [814, 739]
4 814 [] 2 2 NaN
5 491 [] 2 3 NaN
6 822 [] 3 1 NaN
7 752 [] 3 2 NaN
8 739 [(1, 3), (2, 1)] 3 3 [884, 485]
您可以在
多索引中查找:
df1 = df.set_index(['x','y'])
df['ref'] = [[df1.at[y, 'obj'] for y in x] if x else np.nan for x in df1['q']]
print (df)
obj q x y ref
0 901 [] 1 1 NaN
1 907 [(3, 3)] 1 2 [739]
2 884 [] 1 3 NaN
3 485 [(2, 2), (3, 3)] 2 1 [814, 739]
4 814 [] 2 2 NaN
5 491 [] 2 3 NaN
6 822 [] 3 1 NaN
7 752 [] 3 2 NaN
8 739 [(1, 3), (2, 1)] 3 3 [884, 485]
您可以在多索引中查找:
df1 = df.set_index(['x','y'])
df['ref'] = [[df1.at[y, 'obj'] for y in x] if x else np.nan for x in df1['q']]
print (df)
obj q x y ref
0 901 [] 1 1 NaN
1 907 [(3, 3)] 1 2 [739]
2 884 [] 1 3 NaN
3 485 [(2, 2), (3, 3)] 2 1 [814, 739]
4 814 [] 2 2 NaN
5 491 [] 2 3 NaN
6 822 [] 3 1 NaN
7 752 [] 3 2 NaN
8 739 [(1, 3), (2, 1)] 3 3 [884, 485]
ref
列计算的逻辑是什么?您能解释一下ref是如何计算的吗。不清楚。ref
是对x,y
坐标的obj值的查找,该坐标在q
中定义。因此,[(2,2)]
有一个项目,并且对于x=2
和y=2
计算列的逻辑是什么?您能解释一下ref是如何计算的吗。不清楚。ref
是对x,y
坐标的obj值的查找,该坐标在q
中定义。因此,[(2,2)]
有一个项目,并且在x=2
和y=2
的行中有obj的值。现在就试试。我想我可以类似地扩展它,当我有两个以上的列(x,y)和类似(x,y,z)的东西。@Vishal-Ya,然后只需要更改df1=df.set_index(['x','y'])
到df1=df.set_index(['x','y','z'])
是否可以重构df['ref']=…
在不降低速度的情况下提高可读性?@Vishal-你认为重构是什么?这里的速度有点问题,因为pandas无法使用嵌套元组进行矢量化。@coldspeed-所以你们知道答案,若不匹配,它肯定会返回错误。太好了。现在就试试。我想我可以类似地扩展它,当我有两个以上的列(x,y)和类似(x,y,z)的东西。@Vishal-Ya,然后只需要更改df1=df.set_index(['x','y'])
到df1=df.set_index(['x','y','z'])
是否可以重构df['ref']=…
在不降低速度的情况下提高可读性?@Vishal-你认为重构是什么?这里的速度有点问题,因为pandas无法使用嵌套元组进行矢量化。@coldspeed-所以您知道答案,如果不匹配,它肯定会返回错误。请立即尝试。这个解决方案是有意义的。您知道目前提供的两种解决方案中,哪一种更快,并且随着len(df)
成为1e5、1e6和1e7,扩展性更好吗?@Vishal很难说。在我看来,两者都是可行的解决方案。我使用字典进行映射,他使用数据帧索引作为映射器。这两种方法都是有效的。@Vishal你知道该使用什么解决方案了吗?你可以投票选出所有你觉得有用的答案,然后接受你最终使用的答案。现在就试试吧。这个解决方案是有意义的。您知道目前提供的两种解决方案中,哪一种更快,并且随着len(df)
成为1e5、1e6和1e7,扩展性更好吗?@Vishal很难说。在我看来,两者都是可行的解决方案。我使用字典进行映射,他使用数据帧索引作为映射器。这两种方法都是有效的。@Vishal你知道该使用什么解决方案了吗?你可以投票选出所有你认为有用的答案,并接受你最终使用的答案。