【问题标题】:Reshaping two-column data using pandas pivot使用 pandas pivot 重塑两列数据
【发布时间】:2014-07-16 08:15:53
【问题描述】:

我正在尝试将具有两列(重复的 date_time 序列和单列数值)的长文本文件重塑为具有 date_time 单个索引和多列数据的 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()

【问题讨论】:

  • 每套尺寸一样吗?还是开始日期总是一样的?

标签: python python-3.x pandas pivot


【解决方案1】:

您应该首先创建一个新列,指示值必须来自哪一列。

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

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()

这是基于这样一个事实,即当一个新的集合开始时,与上一行的时间差将是负数(如果数据是按时间排序的)。

【讨论】:

  • 哇——我自己写了一个答案,第一句话是“如果你建立一个包含组 id 的列,那么它就知道某物属于哪一列..”然后你的就发布了. :^) 唯一的区别是我将日期列转换为日期时间,然后使用(df[0].diff().fillna(0) &lt;= 0).cumsum() 查找组。
  • @DSM 啊,但这可能是查找不同集合的更可靠的方法。我会补充的!
  • 太棒了!谢谢你们俩。我看不到如何添加该列。我现在必须弄清楚为什么会这样!
  • @user2989613:诀窍是您希望在每个组开始的地方获得 True 值。 True 有一个整数值 1,所以如果你取 [True, False, False, True, False, False] 的累积和,你会得到 [1, 1, 1, 2, 2, 2]。 (如果你喜欢从 0 开始,你可以减 1。)
  • 确实是0.12的奇怪错误。如果不能升级,使用(df['date'].diff() &lt; 0).astype(int).cumsum() 可以帮我解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 2012-12-10
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多