熊猫数据框将长格式的数据转换为特定日期范围的宽格式

时间:2019-02-23 17:59:26

标签: python pandas dataframe

我正在尝试将时间序列数据从长格式转换为宽格式。数据如下。

+======+==========+======+======+
| Name |   Date   | Val1 | Val2 |
+======+==========+======+======+
| A    | 1/1/2018 |    1 |    2 |
+------+----------+------+------+
| B    | 1/1/2018 |    2 |    3 |
+------+----------+------+------+
| C    | 1/1/2018 |    3 |    4 |
+------+----------+------+------+
| D    | 1/4/2018 |    4 |    5 |
+------+----------+------+------+
| A    | 1/4/2018 |    5 |    6 |
+------+----------+------+------+
| B    | 1/4/2018 |    6 |    7 |
+------+----------+------+------+
| C    | 1/4/2018 |    7 |    8 |
+------+----------+------+------+

我的最终目标是创建一个日期范围为01/01/201801/04/2018的数据透视表。由于在日期01/02/201801/03/2018中没有值,所以我希望它们充满NaN。为了进一步简化,这就是我的最终表:

+---+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+
|   | Val1.1/1/2018 | Val2.1/1/2018 | Val1.1/2/2018 | Val2.1/2/2018 | Val1.1/3/2018 | Val2.1/3/2018 | Val1.1/4/2018 | Val2.1/4/2018 |
+---+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+
| A | 1             | 2             | NULL          | NULL          | NULL          | NULL          |             5 |             6 |
| B | 2             | 3             | NULL          | NULL          | NULL          | NULL          |             6 |             7 |
| C | 3             | 4             | NULL          | NULL          | NULL          | NULL          |             7 |             8 |
| D | NULL          | NULL          | NULL          | NULL          | NULL          | NULL          |             4 |             5 |
+---+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+

根据我的理解,有两个步骤可以实现上述目的。 首先是用长格式填充数据,其中日期不存在01/01/201801/04/2018之间,即01/02/201801/03/2018之间。

第二步也是最后一步,将数据转换为宽格式。

为实现第一步,我提到了此post。 根据答案,如果多行中有相似的日期,df.reindex(date_range)会引发以下错误,ValueError: cannot reindex from a duplicate axis是正确的,为了克服这一问题,我遵循了以下代码。

df['Date'] =  pd.to_datetime(df['Date'], format='%m/%d/%Y')
df.set_index('Date', inplace = True)

date_range = pd.date_range('2018-01-01', '2018-01-04', freq='D')
df = df.loc(date_range)

上面的代码使我遇到以下错误:

TypeError: unhashable type: 'DatetimeIndex'

我使用此行代码解决了上述问题

df = df.loc[date_range,:]

虽然我能够获得所需的长格式,但是Python给出了如下警告:

Passing list-likes to .loc or [] with any missing label will raise
KeyError in the future, you can use .reindex() as an alternative.

以上警告,我认为我用缺失日期来实现长格式表的方式不正确,对吗?如果是,那我应该怎么做呢?而且,如何到达我要作为决赛桌的宽幅桌?

编辑: 我已经到达仅包含日期'01/01/2018''01/04/2018'的数据透视表。以下是这段代码。

df1 = df.pivot_table(index='Name', columns='Date', aggfunc='sum')

1 个答案:

答案 0 :(得分:1)

首先重新索引数据框以添加缺少的日期。然后旋转并合并列。

new Date(Date.now() - 7 * 24 * 60 * 60 * 1000) //7 - amount of days