[英]Python Pandas, transform dataframe
我有以下數據框(sim_2005):
Date ELEM1 ELEM2 ... ELEM1133
2005-01-01 0.021 2.455 ... 345.2
2005-01-02 0.321 2.331 ... 355.1
... ... ... ... ...
2005-12-31 0.789 3.456 ... 459.9
[365 rows x 1133 columns]
我需要將其導入以下格式的(postgresql)數據庫中:
ID Date ELEM Value
1 2005-01-01 ELEM1 0.021
2 2005-01-02 ELEM1 0.321
...
366 2005-01-01 ELEM2 2.455
367 2005-01-02 ELEM2 2.331
...
402983 2005-01-01 ELEM1133 345.2
402984 2005-01-02 ELEM1133 355.1
...
403348 2005-12-31 ELEM1133 459.9
我正在盡最大努力遍歷各列並逐步將其串聯起來,
for column in sim_2005:
sim_concat = pd.concat([pd.DataFrame(sim_2005.columns.values), sim_2005.ix[:, column]], ignore_index=True)
到目前為止所產生的不是我想要的。
我也嘗試了pandas樞紐函數,groupby等...,但是我想我對pandas和python的理解通常不足以進行此轉換。 有什么幫助嗎?
編輯:
謝謝,pd.melt是答案!
sim_2005_melted = pd.melt(sim_2005, id_vars=sim_2005.index.name, value_vars=list(sim_2005.columns.values), var_name='ELEM', value_name='Q_sim').sort(columns='Date')
結果是:
ID Date ELEM Q_sim
1 NaN ELEM1 0.021
2 NaN ELEM1 0.321
...
366 NaN ELEM2 2.455
367 NaN ELEM2 2.331
...
402983 NaN ELEM1133 345.2
402984 NaN ELEM1133 355.1
由於某種原因,datetime索引沒有被傳輸,但是總體結構正是我想要的!
看起來您正在用pandas
術語進行“從寬到窄”的轉換。 一種方法是melt
。
在這種情況下,您可以執行以下操作:
pd.melt(df, id_vars=['Date'], value_vars=['ELEM1', 'ELEM2']).sort(columns='Date')
對於具有兩個“寬”列['ELEM1', 'ELEM2']
。 對於示例中的value_vars
列,您顯然不會手工編寫它們,而是使用某種列表理解來創建value_vars
。
例
df = pd.DataFrame({
'Date': range(4),
'ELEM1': range(1, 5),
'ELEM2': range(11, 15),
'ELEM2': range(-5, -1)
})
>> df
Date ELEM1 ELEM2
0 0 1 -5
1 1 2 -4
2 2 3 -3
3 3 4 -2
>> pd.melt(df, id_vars=['Date'], value_vars=['ELEM1', 'ELEM2']).sort(columns='Date')
Date variable value
0 0 ELEM1 1
4 0 ELEM2 -5
1 1 ELEM1 2
5 1 ELEM2 -4
2 2 ELEM1 3
6 2 ELEM2 -3
3 3 ELEM1 4
7 3 ELEM2 -2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.