Pandas数据帧应用功能

时间:2015-05-04 11:21:59

标签: pandas

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

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)如何在上述数据框temp上使用apply函数?

2 个答案:

答案 0 :(得分:1)

这是一种方法。

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

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)

答案 1 :(得分:0)

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

关于其他问题,请使用.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