用管道表达pandas的子集操作[英] Expressing pandas subsetting operation using pipe

本文是小编为大家收集整理的关于用管道表达pandas的子集操作的处理方法,想解了用管道表达pandas的子集操作的问题怎么解决?用管道表达pandas的子集操作问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

有没有一种方法可以使用管道运算符表达下面的 pandas 操作?

 df_a = df[df.index.year != 2000]
 df_b = df_a[(df_a['Month'].isin([3, 4, 5])) & (df_a['region'] == 'USA')]

推荐答案

不确定为什么要使用 pipe 进行此操作.

pipe 旨在通过修改传入 DataFrame (查看文档).

您要做的是使用多个过滤器(或掩码)过滤 DataFrame.

只是为了说明使用 pipe 进行这个操作有点麻烦:

import pandas as pd
pd.np.random.seed(123)
# Generate some data
dates = pd.date_range('2014-01-01', '2015-12-31', freq='M')
df = pd.DataFrame({'region':pd.np.random.choice(['USA', 'Non-USA'], len(dates))}, index=dates)
df['Month'] = df.index.month
print df.head()

             region  Month
2014-01-31      USA      1
2014-02-28  Non-USA      2
2014-03-31      USA      3
2014-04-30      USA      4
2014-05-31      USA      5

你原来的过滤器会产生:

df_a = df[df.index.year != 2014]
df_b = df_a[(df_a['Month'].isin([3, 4, 5])) & (df_a['region'] == 'USA')]
print df_b

           region  Month
2015-03-31    USA      3
2015-05-31    USA      5    

以下是使用 pipe 获得相同输出的方法:

def masker(df, mask):
    return df[mask]

mask1 = df.index.year != 2014
mask2 = df['Month'].isin([3, 4, 5])
mask3 = df['region'] == 'USA'

print df.pipe(masker, mask1).pipe(masker, mask2).pipe(masker, mask3)

           region  Month
2015-03-31    USA      3
2015-05-31    USA      5    

然而,pandas 能够以一种相当简单(在这种特殊情况下)的方式处理过滤:

print df[mask1 & mask2 & mask3]

           region  Month
2015-03-31    USA      3
2015-05-31    USA      5    

本文地址:https://www.itbaoku.cn/post/1727844.html