如何在Python中过滤数据帧时缩短命令



在Python中,过滤数据帧的常用方法如下

df.loc[(df['field 1'] == 'a') & (df['field 2'] == 'b'), 'field 3']...

dfname较长,或者过滤条件较多(以上只有两个)时,上述行自然较长。此外,为每个条件输入df名称有点繁琐。在R或SQL中,我们不需要这样做。所以,我的问题是,是否有一种方法可以在Python中缩短上面的行。例如,是否有一种方法可以让我不必在每个条件下都写下df的名称?谢谢。

您可以使用query方法如下,它具有类似SQL的语法

df.query('field_1 == "a" and field_2 == "b" and field_3 > 3.2 ')

这里是它的文档https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.query.html

我们可以编写一个函数,它接受字段名和条件列表,并行迭代为生成器表达式中的每个名称条件对创建掩码,将这些掩码与numpy.logical_and组合(因为我们想复制&;它将是logical_or(|) -由于特殊的语法规则而跳过冗余的一对括号-并应用结果:

def matching(df, fields, values):
return df.loc[np.logical_and(
df[field] == value
for field, value in zip(fields, values)
)]

这应该允许我们简化代码:

matching(df, ['field 1', 'field 2', 'field 3'], ['a', 'b', 'c'])

或者,我们可以将输入指定为字段值对(并跳过zip步骤),作为字典的键和值(迭代其.items()),等等。使用numpy.logical_and泛化任意多个&是这里的关键见解;剩下的只是软件工程。

可以使用dataframe.eval()函数。可以这样做:

df[df.eval("(field 1 == 'a') & (field 2 == 'b')")]

最新更新