如何在熊猫中使用31列并将它们分组到一个列中?

时间:2016-08-17 20:50:57

标签: python python-2.7 pandas

我有一个非常大的文件,我试图重新格式化以运行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。无论哪个最简单。

1 个答案:

答案 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