Python Pandas基于掩码

时间:2017-01-12 07:49:10

标签: 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 1 0 0 ]
 [ 0 0 0 0 ]]

我想通过掩码的值来剪切主df:如果连续有1,则获取该行。 所以输出应该是另一个看起来像这样的数据框:

      TTL1     TTL2      TTL3       TTL4
1     val1     val2      val3       val4
2     val1     val2      val3       val4

我尝试了这一行,但它不起作用:

df.loc[mask.any(axis=1)]

请问任何想法?

谢谢

2 个答案:

答案 0 :(得分:3)

尝试将locmask.any(1)

一起使用
df.loc[mask.any(1)]

   TTL1  TTL2  TTL3  TTL4
1  val1  val2  val3  val4
2  val1  val2  val3  val4

设置

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],
    ])

答案 1 :(得分:2)

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

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

来自comment - 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]]