过滤 Pandas 数据框和创建新列的更快方法

时间:2021-01-08 05:37:24

标签: python pandas

给定 df

   ticker  close   open
0    AAPL    1.2    1.1
1    TSLA   25.0   27.0
2    TSLA   83.0   80.0
3    TSLA   95.0   93.0
4    CCL   234.0  234.2
5    AAPL  512.0  520.0

我的目的:

(1) 对每个股票数据帧(子集)应用函数

(2) 使用字符串中的值创建新列,例如 'exist' 到每个股票代码数据框

我的预期输出

   ticker  close   open  candlestick   SMA_20     SMA_50
0    AAPL    1.2    1.1  bullish      (number)   (number)
1    TSLA   25.0   27.0  bearish      (number)   (number)
2    TSLA   83.0   80.0  bullish      (number)   (number)
3    TSLA   95.0   93.0  bullish      (number)   (number)
4    CCL   234.0  234.2  bearish      (number)   (number)
5    AAPL  512.0  520.0  bearish      (number)   (number)

我试过这段代码,它非常慢

for x in df.ticker:
    df_ticker = df[df.ticker == x]
    df_close_price = pd.DataFrame(df_ticker.close)
    for days in [20,50]:
       df_ticker[f'SMA_{days}'] = df_close_price.apply(lambda c: abstract.SMA(c, days))
    ......
    df_result = df_result.append(df_ticker)

我想知道如何在处理数百万行时以更快的方式通过代码过滤数据框。许多人建议使用 .locnumpy,但我找不到可能的执行方式。

谢谢!

1 个答案:

答案 0 :(得分:1)

我认为你需要numpy.where

df['candlestick'] = np.where(df['close'] > df['open'], 'bullish', 'bearish')
print (df)
  ticker  close   open candlestick
0   AAPL    1.2    1.1     bullish
1   TSLA   25.0   27.0     bearish
2   TSLA   83.0   80.0     bullish
3   TSLA   95.0   93.0     bullish
4    CCL  234.0  234.2     bearish
5   AAPL  512.0  520.0     bearish

编辑:这里可以将 GroupBy.apply 与自定义函数一起使用,主要将 Series 传递给 abstract.SMA 而不是 .apply(lambda c: abstract.SMA(c, days)

def f(x):
    for days in [20,50]:
        x[f'SMA_{days}'] = abstract.SMA(x.close, days)
    return x  
    
df = df.groupby('ticker')['close'].apply(f)
print (df)