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你知道该使用什么解决方案了吗?你可以投票选出所有你认为有用的答案,并接受你最终使用的答案。