我有一些数据在周末、公共(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
函数,如果您将 datadate
和 id
定义为索引,您可以执行 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/