根据索引

时间:2017-11-23 12:06:12

标签: python pandas subset

我有一个如下所示的DataFrame:

                   0
[0, 0, 0, 0, 0]  0.0    
[1, 0, 0, 0, 0]  1.0
...
[0, 1, 1, 1, 1]  0.0
[1, 1, 1, 1, 1]  1.0

我想将其子集化为包含给定数量1的索引。

条件可能类似于

lambda x: np.count_nonzero(x) == n

表示n个1。

我知道按条件进行子集可以用.loc以某种方式完成,并且有许多答案解释了如何在列上设置条件时这样做。如果条件在索引本身上,我没有找到解释如何做的任何事情。

我试过了:

rounded.loc[np.count_nonzero(rounded.index) == n]

但没有运气。我不确定是否有一些非常明显的东西逃脱了我。

我可以创建一个新的列,其中索引为值和子集基于此,但我想知道是否有更优雅的解决方案。

1 个答案:

答案 0 :(得分:0)

在pandas中可以创建这个索引,但这并不容易。

让我将index转换为list然后转换为array

mask = np.count_nonzero(np.array(rounded.index.values.tolist()), axis=1) == n

样品:

df = pd.DataFrame({0:[0,1.0,0,1], 'a':[[0,0],[1,0],[1,1],[0,1]]})
rounded = df.set_index('a').rename_axis(None)
print (rounded)
          0
[0, 0]  0.0
[1, 0]  1.0
[1, 1]  0.0
[0, 1]  1.0

n = 1
mask = np.count_nonzero(np.array(rounded.index.values.tolist()), axis=1) == n
print (mask)
[False  True False  True]

print (rounded[mask])
          0
[1, 0]  1.0
[0, 1]  1.0