pandas中的大多数操作都可以通过操作符链接(groupby、聚合、应用等)来完成,但我发现过滤行的唯一方法是通过普通的括号索引
df_filtered = df[df['column'] == value]
这是没有吸引力的,因为它要求我分配df到一个变量,然后才能过滤它的值。还有像下面这样的吗?
df_filtered = df.mask(lambda x: x['column'] == value)
pandas中的大多数操作都可以通过操作符链接(groupby、聚合、应用等)来完成,但我发现过滤行的唯一方法是通过普通的括号索引
df_filtered = df[df['column'] == value]
这是没有吸引力的,因为它要求我分配df到一个变量,然后才能过滤它的值。还有像下面这样的吗?
df_filtered = df.mask(lambda x: x['column'] == value)
当前回答
我的答案和其他人的相似。如果您不想创建一个新函数,您可以使用pandas已经为您定义的函数。使用管道法。
df.pipe(lambda d: d[d['column'] == value])
其他回答
这是没有吸引力的,因为它要求我分配df到一个变量,然后才能过滤它的值。
df[df["column_name"] != 5].groupby("other_column_name")
似乎可以工作:你也可以嵌套[]操作符。也许是因为你问了这个问题。
我也有同样的问题,只是我想把这些标准组合成一个OR条件。Wouter Overmeire给出的格式将两个标准组合成一个AND条件,使得两个条件都必须满足:
In [96]: df
Out[96]:
A B C D
a 1 4 9 1
b 4 5 0 2
c 5 5 1 0
d 1 3 9 6
In [99]: df[(df.A == 1) & (df.D == 6)]
Out[99]:
A B C D
d 1 3 9 6
但我发现,如果你把每个条件……== True),并将标准与管道连接,这些标准在OR条件中组合,只要其中任何一个为真就满足:
df[((df.A==1) == True) | ((df.D==6) == True)]
过滤器可以使用Pandas查询链接:
df = pd.DataFrame(np.random.randn(30, 3), columns=['a','b','c'])
df_filtered = df.query('a > 0').query('0 < b < 2')
过滤器也可以在单个查询中组合:
df_filtered = df.query('a > 0 and 0 < b < 2')
您还可以利用numpy库进行逻辑操作。它相当快。
df[np.logical_and(df['A'] == 1 ,df['B'] == 6)]
来自@lodagro的答案很棒。我将通过泛化掩码函数来扩展它:
def mask(df, f):
return df[f(df)]
然后你可以这样做:
df.mask(lambda x: x[0] < 0).mask(lambda x: x[1] > 0)