场景
我想过滤熊猫中的数据帧。它应该返回一个数据帧,其中包含列列表中具有数值的所有行——列表的长度是任意的。
示例
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]