Python基于掩码获取部分数据帧

Python基于掩码获取部分数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个如下所示的数据框: TTL1 TTL2 TTL3 TTL4 0 val1 val2 val3 val4 1 val1 val2 val3 val4 2 val1 val2 val3 val4 3 val1 val2 val3 val4 [[ 0 0 0 0 ] [ 0 0 1 0 ] [ 0

我有一个如下所示的数据框:

      TTL1     TTL2      TTL3       TTL4
0     val1     val2      val3       val4
1     val1     val2      val3       val4
2     val1     val2      val3       val4
3     val1     val2      val3       val4
[[ 0 0 0 0 ]
 [ 0 0 1 0 ]
 [ 0 1 0 0 ]
 [ 0 0 0 0 ]]
      TTL1     TTL2      TTL3       TTL4
1     val1     val2      val3       val4
2     val1     val2      val3       val4
还有一个像这样的面具:

      TTL1     TTL2      TTL3       TTL4
0     val1     val2      val3       val4
1     val1     val2      val3       val4
2     val1     val2      val3       val4
3     val1     val2      val3       val4
[[ 0 0 0 0 ]
 [ 0 0 1 0 ]
 [ 0 1 0 0 ]
 [ 0 0 0 0 ]]
      TTL1     TTL2      TTL3       TTL4
1     val1     val2      val3       val4
2     val1     val2      val3       val4
我想通过掩码的值剪切主df:如果一行中有1个,则获取该行。 因此,输出应该是另一个数据帧,如下所示:

      TTL1     TTL2      TTL3       TTL4
0     val1     val2      val3       val4
1     val1     val2      val3       val4
2     val1     val2      val3       val4
3     val1     val2      val3       val4
[[ 0 0 0 0 ]
 [ 0 0 1 0 ]
 [ 0 1 0 0 ]
 [ 0 0 0 0 ]]
      TTL1     TTL2      TTL3       TTL4
1     val1     val2      val3       val4
2     val1     val2      val3       val4
我试过这句话,但不起作用:

df.loc[mask.any(axis=1)]
有什么想法吗


谢谢

请尝试将
loc
mask一起使用。任何(1)

设置

df = pd.DataFrame(
    {'TTL1': ['val1', 'val1', 'val1', 'val1'],
     'TTL2': ['val2', 'val2', 'val2', 'val2'],
     'TTL3': ['val3', 'val3', 'val3', 'val3'],
     'TTL4': ['val4', 'val4', 'val4', 'val4']}
)

mask = np.array([
        [0, 0, 0, 0],
        [0, 0, 1, 0],
        [0, 1, 0, 0],
        [0, 0, 0, 0],
    ])

我认为您可以省略
loc
,只需要
数组
df
的相同维度:

print (mask.shape)
(4, 4)
print (df.shape)
(4, 4)

print (df[mask.any(axis=1)])
  TTL1  TTL2  TTL3  TTL4
1  val1  val2  val3  val4
2  val1  val2  val3  val4
同:

print (df[mask.any(1)])
  TTL1  TTL2  TTL3  TTL4
1  val1  val2  val3  val4
2  val1  val2  val3  val4
另一个可能的问题是-
string
值而不是
int

mask = np.array([[0, 0, 0, 0 ],
 [ 0, 0, 1, 0 ],
 [ 0, 1, 0, 0 ],
 [ 0, 0, 0, 0 ]]).astype(str)

mask = mask.astype(bool)
print (df[mask.any(1)])
   TTL1  TTL2  TTL3  TTL4
1  val1  val2  val3  val4
2  val1  val2  val3  val4
编辑:

如果值中的字符串
nan
,则可以替换它们:

mask = np.array(
[['0', 'nan', '0', '0'],
 ['0', '0', '1', '0'],
 ['0', '1', '0', '0'],
 ['0', '0', '0', 'nan']])

mask[mask == 'nan'] = 0
mask = mask.astype(bool)
print (mask)
[[False False False False]
 [False False  True False]
 [False  True False False]
 [False False False False]]
或者更简单:

mask = np.array(
[['0', 'nan', '0', '0'],
 ['0', '0', '1', '0'],
 ['0', '1', '0', '0'],
 ['0', '0', '0', 'nan']])

mask = mask == '1'
print (mask)
[[False False False False]
 [False False  True False]
 [False  True False False]
 [False False False False]]

我认为你的密码不管用。什么是错误?那条线应该行得通。你能和大家分享一下它的不足之处吗?确保这些都是整数,而不是
int
的字符串表示形式。如果不是这样,请尝试将它们转换为
int/bool
类型,然后执行子集设置。最后一个
bool
选项是我想要的,不过如果我的掩码中有
NaN
,它会得到一个
True
值,而不是
False
,我如何更改它?您可以使用
mask[np.isnan(mask)]=0
工作起来很神奇。非常感谢。我还有另一个相关的问题:例如,如果第3行的掩码中有
1
值,那么我也希望第3行前后的两行(第1-2行,第4-5行)也变为一行,如何使用掩码呢?我认为对于你的问题,最好使用numpy作为熊猫,而对于我来说numpy则有点复杂。我能做到,但这可能会很长:(所以我认为最好的办法是用期望的结果来创造新的问题,我相信你会从numpy guru的人那里得到很好的答案。晚安,现在没有我的竞争