python - Pandas Data Frame 将特定日期范围的长格式数据转换为宽格式

标签 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/2018 01/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')

最佳答案

首先重新索引 Dataframe 以添加缺失的日期。然后旋转并合并列。

idx = pd.MultiIndex.from_product([df.Name.unique(), pd.date_range(df.Date.min(), df.Date.max())])

df = df.set_index(['Name','Date']).reindex(idx).reset_index().rename(columns = {'level_0':'Name', 'level_1':'Date'})

df.Date = df.Date.dt.strftime('%m/%d/%Y')
new_df = df.pivot('Name', 'Date', ['Val1', 'Val2'])
new_df.columns = new_df.columns.map('.'.join)

    Val1.01/01/2018 Val1.01/02/2018 Val1.01/03/2018 Val1.01/04/2018 Val2.01/01/2018 Val2.01/02/2018 Val2.01/03/2018 Val2.01/04/2018
Name                                
A   1.0             NaN             NaN              5.0            2.0 NaN NaN 6.0
B   2.0             NaN             NaN              6.0            3.0 NaN NaN 7.0
C   3.0             NaN             NaN              7.0            4.0 NaN NaN 8.0
D   NaN             NaN             NaN              4.0            NaN NaN NaN 5.0

关于python - Pandas Data Frame 将特定日期范围的长格式数据转换为宽格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54844453/

相关文章:

python - 如何使 np.argsort 将空字符串放置在数组的末尾而不是开头

python - 根据数值有条件创建数据框列

python - 如何获取 pandas DataFrame 中第二大行值的列名

python - 我正在使用 pandas 从数据框中提取两列,但一列成为索引,然后在尝试访问该列时出现关键错误

python 将每小时数据 [1-24] 添加到日期时间数据

python - Pandas Dataframe 到键值对和 csv 格式

python - Tensorflow 每 channel 量化

python - 为什么 python reduce() 对 `None` 元素的行为不同?

python - 从文本文件中读取值并将其存储到列表中

python - 如何根据python中的公共(public)ID值将2列的垂直pandas表转换为水平表