python - 取消透视 Pandas 数据框的最佳方法

标签 python pandas

我有一些数据在周末、公共(public)假期等缺少值。

 datadate  | id | Value 
-----------------------
1999-12-31 | 01 |  1.0 
1999-12-31 | 02 |  0.5
1999-12-31 | 03 |  3.2
2000-01-04 | 01 |  1.0
2000-01-04 | 02 |  0.7
2000-01-04 | 03 |  3.2

我想复制缺失数据的日期内的值。因此,我旋转了框架、重新编制索引并将值复制下来。

 datadate  | 01  | 02  | 03 
----------------------------
1999-12-31 | 1.0 | 0.5 | 3.2
2000-01-01 | 1.0 | 0.5 | 3.2
2000-01-02 | 1.0 | 0.5 | 3.2
2000-01-03 | 1.0 | 0.5 | 3.2
2000-01-04 | 1.0 | 0.7 | 3.2

现在我想将数据恢复到原来的形式。我试过使用 pd.melt()df.unstack(),但我得到的列比我想要的多,并且构建了一个新数据结果的帧需要很长时间。

是否有更好的方法来逆透视数据?

最佳答案

有一个 pandas.pivot_table 函数,如果您将 datadateid 定义为索引,您可以执行 unstack数据框。

那就是:

from io import StringIO
import pandas

datatable = StringIO("""\
datadate  | id | Value 
1999-12-31 | 01 |  1.0 
1999-12-31 | 02 |  0.5
1999-12-31 | 03 |  3.2
2000-01-04 | 01 |  1.0
2000-01-04 | 02 |  0.7
2000-01-04 | 03 |  3.2""")

fullindex = pandas.DatetimeIndex(freq='1D', start='1999-12-31', end='2000-01-06')
df = (
    pandas.read_table(datatable, sep='\s+\|\s+', parse_dates=['datadate'])
          .set_index(['datadate', 'id'])
          .unstack(level='id')
          .reindex(fullindex)
          .fillna(method='ffill')
          .stack()
          .reset_index()
          .rename(columns={'level_0': 'date'}) 
)

print(df)

这给了我:

         date  id  Value
0  1999-12-31   1    1.0
1  1999-12-31   2    0.5
2  1999-12-31   3    3.2
3  2000-01-01   1    1.0
4  2000-01-01   2    0.5
5  2000-01-01   3    3.2
6  2000-01-02   1    1.0
7  2000-01-02   2    0.5
8  2000-01-02   3    3.2
9  2000-01-03   1    1.0
10 2000-01-03   2    0.5
11 2000-01-03   3    3.2
12 2000-01-04   1    1.0
13 2000-01-04   2    0.7
14 2000-01-04   3    3.2
15 2000-01-05   1    1.0
16 2000-01-05   2    0.7
17 2000-01-05   3    3.2
18 2000-01-06   1    1.0
19 2000-01-06   2    0.7
20 2000-01-06   3    3.2

(我喜欢链接)

关于python - 取消透视 Pandas 数据框的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25770129/

相关文章:

python - group-by 输出中 DateTimeFields 的 Django 时间戳列表

Python:未正确调用 DataFrame 构造函数

python - Pandas Dataframe - 根据条件获取索引值

python - 代理隧道失败: ForbiddenUnable to establish SSL connection

python - 在 python 中使用 asyncio 运行多个套接字

python - 在 Python 中将单词解析为(前缀、词根、后缀)

python - 将分类变量的 Pandas DataFrame 转换为具有计数和比例的 MultiIndex

python - pandas pd.to_datetime() with format argument not giving 12-hour clock with AM/PM

python - 有条件地替换丢失的数据 pandas

python - 将 200 行批量合并到 1 行 Pandas Dataframe 中