[英]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.