pandas python dataframe删除超出预定义限制的所有列中的行

t9eec4r0  于 2023-08-01  发布在  Python
关注(0)|答案(3)|浏览(95)

如果df的所有列超出了指定的限制,我将删除它们。
我的代码:

xdf = pd.DataFrame(columns=['A','B'],data=[[-10,20],[2,8],[4,1],[3,-1]])
print(xdf)
xdf_params_limits = pd.DataFrame(columns=['A','B'],index=['min','max'],data=[[0,1],[5,30]])
print(xdf_params_limits)
xdf_flt = xdf.apply(lambda x: (x[col]>xdf_params_limits[col].loc['min'])&(x[col]<xdf_params_limits[col].loc['max']) for col in xdf.columns, axis=1)
xdf = xdf[xdf_flt]

    A   B
0 -10  20
1   2   8
2   4   1
3   3  -1
     A   B
min  0   1
max  5  30

字符串
预期产量
xdf =

A   B
1   2   8


当前输出:

81 def ast_parse(self, source, filename='<unknown>', symbol='exec'):
     82     """Parse code to an AST with the current compiler flags active.
     83 
     84     Arguments are exactly the same as ast.parse (in the standard library),
     85     and are passed to the built-in compile function."""
---> 86     return compile(source, filename, symbol, self.flags | PyCF_ONLY_AST, 1)

SyntaxError: Generator expression must be parenthesized (2981748052.py, line 5)

qojgxg4l

qojgxg4l1#

使用两个掩码和all的简单布尔索引:

out = xdf.loc[(xdf.gt(xdf_params_limits.loc['min'])
              &xdf.lt(xdf_params_limits.loc['max'])
              ).all(axis=1)]

字符串
输出量:

A  B
1  2  8


中间体:

xdf.gt(xdf_params_limits.loc['min'])

       A      B
0  False   True
1   True   True
2   True  False
3   True  False

xdf.lt(xdf_params_limits.loc['max'])

      A     B
0  True  True
1  True  True
2  True  True
3  True  True

kr98yfug

kr98yfug2#

使用np.column_stack(...).any(1)获取布尔掩码:

xdf[np.column_stack([(xdf[c] > xdf_params_limits[c]['min']) \
    & (xdf[c] < xdf_params_limits[c]['max']) for c in xdf.columns]).all(1)]

个字符

2j4z5cfb

2j4z5cfb3#

对Pandas的第一条规矩,就是“永不用为”。二是“绝不使用apply”。
所以,如果你想要一个快速的计算,你需要考虑全局。“
现在,这些规则也有例外。例如,如果您有许多行,但只有几列,则可以对列进行迭代。然后你得到的答案,就是这样做的,是好的。
如果您也可能有许多列,则还需要对沿着列发生的情况进行矢量化。
一种方法是用numpy

xdf[((xdf.values > xdf_params_limits.values[:1,:]) & (xdf.values < xdf_params_limits.values[1:,:])).all(axis=1)]

字符串
它所做的是将所有值与“最小值行”和“最大值”行进行比较(依靠numpy的广播将n行与单行进行比较),以创建一个布尔索引用作选择器。
xdf_params_limits.values[:1,:]xdf_params_limits.values[1:,:]只是以懒惰的方式来选择minmax行,然后添加一个新的轴。我也可以选择xdf_params_limits.loc['min'].values[np.newaxis,:]xdf_params_limits.loc['max'].values[np.newaxis,:]

相关问题