让我们说我有一个数据框:
df = pd.DataFrame({"a": range(1,5), "b": range(6, 10), "c": range(11, 15) , "d": range(15, 19)})
我想根据构成坐标点的两列的值来过滤此数据帧。假设c,d分别是x和y坐标。但是,我想检查是否给出了数据框中的点列表,这些点是否落在x坐标列表和y坐标列表的值之内。
x_coord = [4,12,13,17,19]
y_coord = [16,18,25,29,32]
使用熊猫的“ isin”功能,如何同时解析数据帧的c列和d列,并对照列表中的值进行检查? (我希望能够对大型数据帧使用此解析方法)
想要的输出:包含原始数据帧整行的数据帧,该数据帧同时具有x和y列表中的c和d值。
答案 0 :(得分:1)
您可以通过创建一个新列作为其他两个的元组并在该列中使用isin
来做到这一点:
In[0]: df['coords'] = list(zip(df['c'], df['d']))
: df[df['coords'].isin(zip(x_coord, y_coord))]
Out[0]:
a b c d e
0 1 6 11 15 NaN
1 2 7 12 16 NaN
2 3 8 13 17 NaN
3 4 9 14 18 NaN
或者您可以使用坐标创建新的数据框,并使用inner_join方法仅获取匹配的行。
In[0]: df = pd.DataFrame({"a": range(1,5), "b": range(6, 10), "c": range(11, 15) , "d": range(15, 19), "e": np.nan})
: x_coord = range(11, 15)
: y_coord = range(15, 19)
: coords = pd.DataFrame(list(zip(x_coord, y_coord)), columns=['c', 'd'])
: df.merge(coords, on=['c', 'd'], how='inner')
Out[0]:
a b c d e
0 1 6 11 15 NaN
1 2 7 12 16 NaN
2 3 8 13 17 NaN
3 4 9 14 18 NaN