如何使用运算符链接项目列表



场景

我想过滤熊猫中的数据帧。它应该返回一个数据帧,其中包含列列表中具有数值的所有行——列表的长度是任意的。

示例

a   b   c
1      1   1   1
2      1   g   8
3      h   1   1
4      2   2   2
  • 如果我用列[b,c]调用函数,我需要第1、3和4行
  • 如果我用列[a]调用函数,我需要第1、2和4行

我提出了一个实现,它感觉不像蟒蛇,但可以工作:

import typing
import pandas as pd
def filter_df(dataframe: pd.DataFrame, filter_columns: typing.List[str]) -> pd.DataFrame:
and_connected_filters = None
for column_name in filter_columns:
condition: pd.Series = dataframe[column_name].str.isnumeric()
if and_connected_filters is None:
and_connected_filters = condition
else:
and_connected_filters = and_connected_filters & condition
return dataframe[and_connected_filters]

有没有一种更像蟒蛇的方法可以用运算符(&)链接项目列表

我在想一个",".join(...)的等价物,但找不到任何东西。

我会使用不同的方法,将状态检查为2D,并使用all:进行聚合

cols = ['b', 'c']
s = (df[cols].apply(pd.to_numeric, errors='coerce')
.notna().all(axis=1)
)
out = s[s].index.to_list()

或者,如果您确定有字符串作为输入:

cols = ['b', 'c']
s = (df[cols]
.apply(lambda s: s.str.isnumeric())
.all(axis=1)
)
out = s[s].index.to_list()

输出:[1, 3, 4]

带有numpy.logical_and.reduce:的变体

import numpy as np
df.index[np.logical_and.reduce([df[c].str.isnumeric() for c in cols])].to_list()

输出:[1, 3, 4]

最新更新