在Pandas中将列表转换并重塑为DataFrame

3 投票
1 回答
3566 浏览
提问于 2025-04-18 09:03

我想把一个列表(x)转换成一个10行3列的数据表。具体来说,我想用列表中的前三个条目作为列名。接下来的三个条目放在第一行,之后的三个条目放在第二行,依此类推。换句话说,我的数据表应该有三列,列名分别是'Phase'、'Formula'和'Sat Indx'。然后第一行的条目应该是Calcite、CaCO3和.8409。

我试过以下方法,但出现了错误:

z=DataFrame(x, columns=['Phase','Formula','Sat Indx'])

print(x)

[u'Phase          ',
 u'Formula        ',
 u'Sat Indx',
 u'Calcite        ',
 u'CaCO3          ',
 0.8409314786906652,
 u'Aragonite      ',
 u'CaCO3          ',
 0.6971616312984299,
 u'H2O(g)         ',
 u'H2O            ',
 -1.5101143330253721,
 u'CO2(g)         ',
 u'CO2            ',
 -1.5522870578743806,
 u'Gypsum         ',
 u'CaSO4:2H2O     ',
 -2.993649142404755,
 u'Anhydrite      ',
 u'CaSO4          ',
 -3.2135284668446644,
 u'Portlandite    ',
 u'Ca(OH)2        ',
 -10.738067251525967,
 u'H2(g)          ',
 u'H2             ',
 -22.6,
 u'O2(g)          ',
 u'O2             ',
 -37.98786977495807,
 u'CH4(g)         ',
 u'CH4            ',
 -66.16971681191183]

1 个回答

1

你首先应该把这个列表转换成更合适的格式。

一种方法是用列表推导式把它转换成一个子列表的列表(每一行对应一个子列表):

In [10]: x_sublists = [x[i:i+3] for i in range(0, len(x), 3)]

In [11]: pd.DataFrame(x_sublists [1:], columns=x_sublists [0])
Out[11]: 
   Phase            Formula                Sat Indx
0  Calcite          CaCO3            0.840931478691
1  Aragonite        CaCO3            0.697161631298
2  H2O(g)           H2O              -1.51011433303
3  CO2(g)           CO2              -1.55228705787
4  Gypsum           CaSO4:2H2O        -2.9936491424
5  Anhydrite        CaSO4            -3.21352846684
6  Portlandite      Ca(OH)2          -10.7380672515
7  H2(g)            H2                        -22.6
8  O2(g)            O2                -37.987869775
9  CH4(g)           CH4              -66.1697168119

另一种方法是把这个列表重新整理成一个numpy数组(不过这样做有个缺点,就是会导致某一列的数据类型变成对象类型,正如@DSM所提到的,所以为了得到和上面一样的结果,这一列需要手动设置为浮点数类型):

In [67]: x_reshaped = np.array(x[3:], dtype=object).reshape((-1, 3))

In [68]: df = pd.DataFrame(x_reshaped, columns=x[:3])

In [69]: df['Sat Indx'] = df['Sat Indx'].astype(float)

撰写回答