我有一个非常大的文件,我试图重新格式化以运行QC检查。格式很奇怪我如何将它变成一个包含每个日期记录的单个列?
目前的代码是:
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
最高的数字是该月的日期,而在月份列中,我们每个月都有相应的月份,直到201608年(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 :(得分: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