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的人那里得到很好的答案。晚安,现在没有我的竞争