我正在进行一个项目,该项目要求我基于X和Y两个单独的列匹配两个数据帧。
例如
df1=
| X | Y | AGE |
|:--- |:---:|----:|
| 20 | 15 | 25 |
| 10 | 05 | 29 |
| 15 | 00 | 21 |
| 20 | 20 | 32 |
| 00 | 15 | 19 |
df2=
| X | Y | AGE |
|:--- |:---:|----:|
| 00 | 00 | [] |
| 00 | 05 | [] |
| 00 | 10 | [] |
| 00 | 15 | [] |
| 00 | 20 | [] |
| 05 | 00 | [] |
| 05 | 05 | [] |
| 05 | 10 | [] |
| 05 | 15 | [] |
| 05 | 20 | [] |
| 10 | 00 | [] |
| 10 | 05 | [] |
| 10 | 10 | [] |
| 10 | 15 | [] |
| 10 | 20 | [] |
| 15 | 00 | [] |
| 15 | 05 | [] |
| 15 | 10 | [] |
| 15 | 15 | [] |
| 15 | 20 | [] |
| 20 | 00 | [] |
| 20 | 05 | [] |
| 20 | 10 | [] |
| 20 | 15 | [] |
| 20 | 20 | [] |
目标是对df1进行排序,在df2中找到具有匹配坐标的行,然后将df1中的AGE值存储在df2的AGE列表中。到目前为止,我的代码是:
for n in df1:
if int(df1["X"].values[n]) == int(df2["X"].values[n]):
for m in df1:
if int(df1["Y"].values[m]) == int(df2["Y"].values[m]):
df2['AGE'].push(df1['AGE'])
预期输出为:
df2=
| X | Y | AGE |
|:--- |:---:|----:|
| 00 | 00 | [] |
| 00 | 05 | [] |
| 00 | 10 | [] |
| 00 | 15 |[19] |
| 00 | 20 | [] |
| 05 | 00 | [] |
| 05 | 05 | [] |
| 05 | 10 | [] |
| 05 | 15 | [] |
| 05 | 20 | [] |
| 10 | 00 | [] |
| 10 | 05 |[29] |
| 10 | 10 | [] |
| 10 | 15 | [] |
| 10 | 20 | [] |
| 15 | 00 |[21] |
| 15 | 05 | [] |
| 15 | 10 | [] |
| 15 | 15 | [] |
| 15 | 20 | [] |
| 20 | 00 | [] |
| 20 | 05 | [] |
| 20 | 10 | [] |
| 20 | 15 |[25] |
| 20 | 20 |[32] |
您可以执行匹配X&Y基于CCD_ 1。我刚刚读到你需要两列X&Y为整数。不确定我是否理解保留原始X&Y值到"0";绘制它们的图形";。这里有一种可能的方法:
for col in ['X', 'Y']:
df1[col+'1'] = df1[col].astype('int')
df2[col+'1'] = df2[col].astype('int')
print(pd.merge(df2, df1[['AGE', 'X1', 'Y1']], how='left', on=['X1', 'Y1']))
输出:
X Y X1 Y1 AGE
0 00 00 0 0 NaN
1 00 05 0 5 NaN
2 00 10 0 10 NaN
3 00 15 0 15 19
4 00 20 0 20 NaN
5 05 00 5 0 NaN
6 05 05 5 5 NaN
7 05 10 5 10 NaN
8 05 15 5 15 NaN
9 05 20 5 20 NaN
10 10 00 10 0 NaN
11 10 05 10 5 29
12 10 10 10 10 NaN
13 10 15 10 15 NaN
14 10 20 10 20 NaN
15 15 00 15 0 21
16 15 05 15 5 NaN
17 15 10 15 10 NaN
18 15 15 15 15 NaN
19 15 20 15 20 NaN
20 20 00 20 0 NaN
21 20 05 20 5 NaN
22 20 10 20 10 NaN
23 20 15 20 15 25
24 20 20 20 20 32