有没有办法可以使用管道运算符表达下面的pandas操作?
df_a = df[df.index.year != 2000]
df_b = df_a[(df_a['Month'].isin([3, 4, 5])) & (df_a['region'] == 'USA')]
答案 0 :(得分:2)
不确定为什么要将pipe
用于此操作。
pipe
旨在通过一系列修改传入的DataFrame(see docs)的函数,为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