![](/img/trans.png)
[英]Pandas: Read a CSV of timeseries data with 'column' header as row element
[英]Converting row in timeseries data to column
假設我有一個類似的時間序列
In [41]: df = pd.DataFrame(dict(names=list('abcaabcabbcc'), vals=np.random.randint(0, 10, 12)), index
...: =pd.date_range('2017-03-01', periods=12))
In [42]: df
Out[42]:
names vals
2017-03-01 a 2
2017-03-02 b 9
2017-03-03 c 6
2017-03-04 a 6
2017-03-05 a 5
2017-03-06 b 2
2017-03-07 c 3
2017-03-08 a 1
2017-03-09 b 1
2017-03-10 b 1
2017-03-11 c 1
2017-03-12 c 0
如何將names
行轉換為對應的vals
所在的列標題? 例如
a b c
2017-03-01 2 nan nan
2017-03-02 nan 9 nan
...
我一直在玩pd.melt
,並嘗試將names
添加到索引中,然后重設索引,以便它們以某種方式成為列,但是我非常困惑。
您可以使用:
print (pd.pivot(index=df.index, columns=df['names'], values=df['vals']))
要么:
print (df.set_index('names', append=True)['vals'].unstack())
names a b c
2017-03-01 4.0 NaN NaN
2017-03-02 NaN 0.0 NaN
2017-03-03 NaN NaN 3.0
2017-03-04 8.0 NaN NaN
2017-03-05 0.0 NaN NaN
2017-03-06 NaN 0.0 NaN
2017-03-07 NaN NaN 9.0
2017-03-08 6.0 NaN NaN
2017-03-09 NaN 6.0 NaN
2017-03-10 NaN 0.0 NaN
2017-03-11 NaN NaN 3.0
2017-03-12 NaN NaN 9.0
print (df.reset_index().pivot_table(index='index', columns='names', values='vals'))
您還可以使用unstack():
In [12]: df.set_index('names', append=True).unstack('names')
Out[12]:
vals
names a b c
2017-03-01 1.0 NaN NaN
2017-03-02 NaN 4.0 NaN
2017-03-03 NaN NaN 5.0
2017-03-04 8.0 NaN NaN
2017-03-05 8.0 NaN NaN
2017-03-06 NaN 5.0 NaN
2017-03-07 NaN NaN 7.0
2017-03-08 5.0 NaN NaN
2017-03-09 NaN 7.0 NaN
2017-03-10 NaN 4.0 NaN
2017-03-11 NaN NaN 3.0
2017-03-12 NaN NaN 4.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.