我有一个如下所示的数据框:
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)]
请问任何想法?
谢谢
答案 0 :(得分:3)
尝试将loc
与mask.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
,只需要array
和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
来自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]]