【问题标题】:Pandas dataframe apply function熊猫数据框应用功能
【发布时间】:2015-05-04 21:25:40
【问题描述】:

我有一个看起来像这样的数据框。

df.head()
     Ship Date  Cost Amount
0   2010-08-01  4257.23300
1   2010-08-01  9846.94540
2   2010-08-01  35.77764
3   2010-08-01  420.82920
4   2010-08-01  129.49638

我必须每周明智地收集数据:

df['week_num'] = pd.DatetimeIndex(df['Ship Date']).week
x = df.groupby('week_num').sum()

它会生成一个如下所示的数据框:

         Cost Amount
week_num    
30       3.273473e+06
31       9.715421e+07
32       9.914568e+07
33       9.843721e+07
34       1.065546e+08
35       1.087598e+08
36       8.050456e+07

现在我想添加一个包含星期和年份信息的列来执行此操作:

def my_conc(row):
    return str(row['week_num'])+str('2011')

x['year_week'] = x.apply(my_conc,axis= 1)

这给了我一条错误消息:

KeyError: ('week_num', u'occurred at index 30')

现在我的问题是 1) 为什么 groupby 函数生成的数据帧看起来有点奇怪,因为它没有 week_num 作为列名? 2)有没有更好的方法来生成带有分组数据的数据框? 3) 如何在上述dataframetemp上使用apply函数?

【问题讨论】:

  • 你是怎么df.groupby('week_num').sum() 的?当df 没有week_num 列时。
  • @JohnGalt ,抱歉我错过了中间步骤。我现在已经添加了。

标签: pandas


【解决方案1】:

这是一种方法。

groupby 中使用as_index=False 不创建索引。

In [50]: df_grp = df.groupby('week_num', as_index=False).sum()

然后apply lambda 函数。

In [51]: df_grp['year_week'] = df_grp.apply(lambda x: str(x['week_num']) + '2011',
                                            axis=1)

In [52]: df_grp
Out[52]:
   week_num       Cost year_week
0        30    3273473    302011
1        31   97154210    312011
2        32   99145680    322011
3        33   98437210    332011
4        34  106554600    342011
5        35  108759800    352011
6        36   80504560    362011

或使用df_grp.apply(lambda x: '%d2011' % x['week_num'], axis=1)

【讨论】:

  • 它工作正常!只是另一个额外的问题,熊猫是否将周年组合识别为日期类型?
【解决方案2】:

关于你的第一个问题,我不知道。当我尝试复制它时,我得到了一个错误。

关于其他问题,将 .dt 访问器用于 groupby() 函数...

# get your data into a DataFrame
data = """Ship Date  Cost Amount
0   2010-08-01  4257.23300
1   2010-08-01  9846.94540
2   2010-08-01  35.77764
3   2010-08-01  420.82920
4   2010-08-01  129.49638
"""
from StringIO import StringIO # import from io for Python 3
df = pd.read_csv(StringIO(data), header=0, index_col=0, sep='  ', skipinitialspace=True)

# make the dtype for the column datetime64[ns]
df['Ship Date'] = pd.to_datetime(df['Ship Date'])

# then you can use the .dt accessor to group on 
x = df.groupby(df['Ship Date'].dt.dayofyear).sum()
y = df.groupby(df['Ship Date'].dt.weekofyear).sum()

还有更多这样的 .dt 访问器...link

【讨论】:

  • 它似乎不起作用。它抛出一个错误'Series' object has no attribute 'dt'
  • 需要更改数据类型:pd.to_datetime(df['Ship Date'])
  • 我已经这样做了。 df['Ship Date'] 是不存在 dt 属性的系列。
  • 它是什么数据类型 - df.info() 返回什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
相关资源
最近更新 更多