我有一个看起来像这样的数据框。
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函数?
答案 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