2016-08-17 106 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

相關問題