我有两个列表,即
x = [3, 7, 9, ...]
和y = [13, 17, 19, ...]
我有一个这样的数据框:
df =
x y z
0 0 10 0.54
1 1 11 0.68
2 2 12 0.75
3 3 13 0.23
4 4 14 0.52
5 5 15 0.14
6 6 16 0.23
. . . ..
. . . ..
我想做的是以一种有效的方式对成对组合进行数据切片,如下所示:
df_slice = df [ ( (df.x == x[0]) & (df.y == y[0]) ) |
( (df.x == x[1]) & (df.y == y[0]) ) |
....
( (df.x == x[-1) & (df.y == y[-1]) ) ]
df_slice =
x y z
3 3 13 0.23
7 7 17 0.74
9 9 19 0.24
. .. .. ....
有什么方法可以以编程方式快速地做到这一点?
答案 0 :(得分:0)
创建没有参数on
的帮助器DataFrame和DataFrame.merge
,以便合并所有相交的列,这里是x
和y
:
x = [3, 7, 9]
y = [13, 17, 19]
df1 = pd.DataFrame({'x':x, 'y':y})
df2 = df.merge(df1)
print (df2)
x y
0 3 13
或通过Index.isin
获取MultiIndex
es的交集并通过boolean indexing
进行过滤:
mux = pd.MultiIndex.from_arrays([x, y])
df2 = df[df.set_index(['x','y']).index.isin(mux)]
print (df2)
x y
3 3 13
应该通过压缩列表和np.logical_or.reduce的列表理解来更改您的解决方案:
mask = np.logical_or.reduce([(df.x == a) & (df.y == b) for a, b in zip(x, y)])
df2 = df[mask]
print (df2)
x y z
3 3 13 0.23