2016-08-17 105 views
1

我有一个非常大的文件,我试图重新格式化运行QC检查。这种格式非常奇怪,我如何将它制作成一个单独的列,每个日期都有记录?我该如何在熊猫中将31天的天数分成几列,并将它们分组为一列?

当前的代码是:

group = df.groupby(['ID','MONTH'], as_index = True).sum() 

数据框看起来像这样的任何分组之前:

ID TASK MONTH 1 2 3 4 5 6 P502867 5.34545 201601 4.664981 4.6699 4.557714 P502867 5.34545 201602 4.736791 4.664536 4.751841 4.744383

顶部数字是该月的天,在本月专栏中,我们有每个对应月份至2016年(8月)。基本上我想按ID,月份分组,然后在每个月内分配每一天。因此,这将使我能够在列表中运行并将其与具有日常记录的另一个文件进行比较。输出数据帧将看起来像:

ID TASK MONTH DAY VALUE P502867 5.34545 201601 1
P502867 5.34545 201601 2
P502867 5.34545 201601 3 4.664981 P502867 5.34545 201601 4 4.6699

而且它甚至可能是有益的月和日追加在一起吗?如20160101,20160102.无论哪一个最简单。

回答

0

你可以melt的日子。

df2 = pd.melt(df, id_vars=df.columns[:3].tolist(), var_name='day', 
       value_vars=df.columns[3:].tolist()) 
df2['timestamp'] = pd.to_datetime(df2.MONTH.astype(str) + df2.day.astype(str), 
            format='%Y%m%d') 
>>> df2.sort_values(['ID', 'timestamp']) 
     ID  TASK MONTH day  value timestamp 
0 P502867 5.34545 201601 1 4.664981 2016-01-01 
2 P502867 5.34545 201601 2 4.669900 2016-01-02 
4 P502867 5.34545 201601 3 4.557714 2016-01-03 
6 P502867 5.34545 201601 4  NaN 2016-01-04 
8 P502867 5.34545 201601 5  NaN 2016-01-05 
10 P502867 5.34545 201601 6  NaN 2016-01-06 
1 P502867 5.34545 201602 1 4.736791 2016-02-01 
3 P502867 5.34545 201602 2 4.664536 2016-02-02 
5 P502867 5.34545 201602 3 4.751841 2016-02-03 
7 P502867 5.34545 201602 4 4.744383 2016-02-04 
9 P502867 5.34545 201602 5  NaN 2016-02-05 
11 P502867 5.34545 201602 6  NaN 2016-02-06 

或者,您可以删除那些没有价值:

>>> df2.dropna(subset=['value']) 
     ID  TASK MONTH day  value timestamp 
0 P502867 5.34545 201601 1 4.664981 2016-01-01 
1 P502867 5.34545 201602 1 4.736791 2016-02-01 
2 P502867 5.34545 201601 2 4.669900 2016-01-02 
3 P502867 5.34545 201602 2 4.664536 2016-02-02 
4 P502867 5.34545 201601 3 4.557714 2016-01-03 
5 P502867 5.34545 201602 3 4.751841 2016-02-03 
7 P502867 5.34545 201602 4 4.744383 2016-02-04 
+0

伟大的回答,非常感谢! – staten12

相关问题