python - 使用 pandas 数据透视 reshape 两列数据

标签 python python-3.x pandas pivot

我正在尝试将具有两列(重复的日期时间序列和单列数值)的长文本文件 reshape 为具有单个日期时间索引和多列数据的 Pandas 数据框。实际文件是 100 组 82 年的每日降雨数据(来自随机生成器),大约 300 万行。我想要针对 82 x 365(366 闰年)日期时间索引获取 100 列降雨数据。为了简化练习,我在下面提供了一个示例(代表闰年的四行序列):

2014/01/01  1
2014/01/02  2
2014/01/03  3

2014/01/01  4
2014/01/02  5
2014/01/03  6
2014/01/04  7

2014/01/01  8
2014/01/02  9
2014/01/03  10

所需的输出类似于:

              0    1    2
2014/01/01    1    4    8
2014/01/02    2    5    9
2014/01/03    3    6    10
2014/01/04    nan  7    nan

这看起来极其简单,但却让我感到困惑。我尝试将原始系列转换为数据框,然后使用以下内容,但 Pandas 似乎不喜欢单个列:

df.pivot()

最佳答案

您应该首先创建一个新列来指示值必须出现在哪一列中。

假设您知道每个序列的开始日期(并且每次都相同),您可以例如这样做:

In [7]: df['set'] = (df['date'] ==  '2014/01/01').cumsum()

In [8]: df
Out[8]: 
         date  value  set
0  2014/01/01      1    1
1  2014/01/02      2    1
2  2014/01/03      3    1
3  2014/01/01      4    2
4  2014/01/02      5    2
5  2014/01/03      6    2
6  2014/01/04      7    2
7  2014/01/01      8    3
8  2014/01/02      9    3
9  2014/01/03     10    3 

当您拥有此列时,您可以使用pivot:

In [9]: df.pivot(index='date', columns='set', values='value')
Out[9]: 
set          1  2   3
date                 
2014/01/01   1  4   8
2014/01/02   2  5   9
2014/01/03   3  6  10
2014/01/04 NaN  7 NaN

编辑:感谢 DSM,这是查找组的另一种方法(并且您不必知道每个组的第一项):

In [10]: df['date'] = pd.to_datetime(df['date'])

In [11]: df['set'] = (df['date'].diff().fillna(0) <= 0).cumsum()

这是基于这样的事实:当新的一组开始时,与前一行的时间差将为负(如果数据按时间排序)。

关于python - 使用 pandas 数据透视 reshape 两列数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23889048/

相关文章:

python - 获取 json URL 的 "No JSON object could be decoded"

Python pandas,按数据框中的日期聚合值

python - 如何将中间量的数据传递给子进程?

python - 我应该如何使用 python 和 redis 存储简单对象?

python - 使用相同的键对过去的条目进行计数

python - 智能卡 PKCS11 AES key 生成失败

python - 如何在 pandas 中进行分组和变换

python - 使用数组条目存储数据框

python - 如何在数据框中搜索包含字典表示的所有元素的行?

python-3.x - 计算滚动 3 天 Pandas 中的不同计数?