逐对属性划分的熊猫切片

时间:2019-07-05 08:09:56

标签: python pandas

我有两个列表,即

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
.  ..   ..  ....

有什么方法可以以编程方式快速地做到这一点?

1 个答案:

答案 0 :(得分:0)

创建没有参数on的帮助器DataFrame和DataFrame.merge,以便合并所有相交的列,这里是xy

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