【问题标题】:numpy under a groupby not workinggroupby下的numpy不起作用
【发布时间】:2018-02-11 11:16:55
【问题描述】:

我有以下代码:

import pandas as pd
import numpy as np

df = pd.read_csv('C:/test.csv')
df.drop(['SecurityID'],1,inplace=True)                         

Time = 1
trade_filter_size = 9
groupbytime = (str(Time) + "min")
df['dateTime_s'] = df['dateTime'].astype('datetime64[s]')
df['dateTime'] = pd.to_datetime(df['dateTime'])
df[str(Time)+"min"] = df['dateTime'].dt.floor(str(Time)+"min")
df['tradeBid'] = np.where(((df['tradePrice'] <= df['bid1']) & (df['isTrade']==1)), df['tradeVolume'], 0)

groups = df[df['isTrade'] == 1].groupby(groupbytime)                        
print("groups",groups.dtypes)

#THIS IS WORKING
df_grouped = (groups.agg({
            'tradeBid': [('sum', np.sum),('downticks_number', lambda x: (x > 0).sum())],
            }))

# creating a new data frame which is filttered
df2 = pd.DataFrame( df.loc[(df['isTrade'] == 1) & (df['tradeVolume']>=trade_filter_size)])
#recalculating all the bid/ask volume to be bsaed on the filter size
df2['tradeBid'] = np.where(((df2['tradePrice'] <= df2['bid1']) & (df2['isTrade']==1)), df2['tradeVolume'], 0)


df2grouped = (df2.agg({
      # here is the problem!!! NOT WORKING
      'tradeBid': [('sum', np.sum), lambda x: (x > 0).sum()],
       }))

使用相同的功能tradeBid': [('sum', np.sum),('downticks_number', lambda x: (x &gt; 0).sum())。第一次它工作正常,但是在新 df 中对过滤数据执行此操作时会导致错误:

ValueError: downticks_number 是一个未知的字符串函数

当我使用此代码来解决上述问题时

  'tradeBid': [('sum', np.sum), lambda x: (x > 0).sum()],

我得到这个错误:

ValueError: 不能结合转换和聚合操作

知道为什么我使用相同的代码会得到不同的结果吗?

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    因为有 2 个条件可以匹配第二个 groupby,所以我通过创建一个用作过滤器的新列(同时包含 2 个过滤器)将过滤器移动到 df 中来解决这个问题。 比groupby没有问题 顺序是问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-07
      • 2013-07-29
      • 2019-03-27
      • 1970-01-01
      相关资源
      最近更新 更多