所以我有ID,日期以及他们当天是否进行过活动的数据
ID DATE DONE
1 2009-1-3 Yes
1 2009-1-15 Yes
2 2009-9-3 Yes
3 2009-10-7 No
1 2009-12-1 Yes
3 2009-10-8 Yes
2 2009-10-21 Yes
所以我想分组并创建包含月份和1的列(如果他们在当月0点。)
ID 2009-1 2009-2 ... 2009-9 2009-10 2009-11 2009-12
1 1 0 ... 0 0 0 1
2 0 0 ... 1 1 0 0
3 0 0 ... 0 0 0 0
谢谢
答案 0 :(得分:1)
先使用Series
groupby
+ all
,然后再使用unstack
s=df['DONE'].eq('Yes').\
groupby([df['ID'],df.DATE.dt.strftime('%Y-%m')]).\
all().astype(int).unstack(fill_value=0)
s
Out[1026]:
DATE 2009-01 2009-09 2009-10 2009-12
ID
1 1 0 0 1
2 0 1 1 0
3 0 0 0 0
答案 1 :(得分:1)
另一种方式
Setup
df.DATE = pd.to_datetime(df.DATE)
df.DONE = df.DONE.map({'Yes':1, 'No':0})
Solution
然后创建200901
样式的辅助int列
df['DATE2']=df.DATE.dt.year.astype(str).add(df.DATE.dt.month.astype(str).str.zfill(2)).astype(int)
和pivot_table
+ reindex
df.pivot_table(columns='DATE2', index='ID', values='DONE').reindex(np.arange(200901, 200913), axis='columns').fillna(0)
DATE2 200901 200902 200903 200904 200905 200906 200907 200908 200909 200910 200911 200912
ID
1 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0
2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0
3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0
答案 2 :(得分:1)
我知道我来晚了,但是我认为这个解决方案也很不错:
df['DATE'] = pd.to_datetime(df['DATE']).dt.strftime('%Y-%m')
(df.pivot(columns='DATE', values='DONE') == 'Yes') + 0