繁体   English   中英

Python Pandas,转换数据框

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM