列出熊猫数据框-Python

时间:2019-10-10 09:42:29

标签: python pandas list dataframe

我有以下列表:

list = [-0.14626096918979603,
 0.017925919395027533,
 0.41265398151061766]

我使用以下代码创建了pandas dataframe

df = pd.DataFrame(list, index=['var1','var2','var3'], columns=['Col1'])
df
               Col1
var1         -0.146261
var2         0.017926
var3         0.412654

现在我有了一个新列表:

list2 = [-0.14626096918979603,
 0.017925919395027533,
 0.41265398151061766,
 -0.8538301985671065,
 0.08182534201640915,
 0.40291331836021105]

我希望以这样的方式排列dataframe:输出看起来像这样(手动编辑)

               Col1            Col2
var1         -0.146261   -0.8538301985671065
var2         0.017926   0.08182534201640915
var3         0.412654   0.40291331836021105

并且只要有第三或第四列...数据就以相同的方式排列。我试图将列表转换为dict,但是由于我是python的新手,所以我没有得到所需的输出,而只是由于形状无效而导致错误。

-编辑-

创建完数据框后,我想使用df.plot()对其进行绘制。但是,显示数据的方式不是我想要的。我来自R,因此不确定是否是由于dataframe中使用的数据结构。是每行需要一个测量值吗?

enter image description here

我的想法是在x轴上具有col1col2col3(这是一个时间序列)。在y轴上,值的范围(在该图中可以)和differnetnet线应显示var1var2var3等的演变。

4 个答案:

答案 0 :(得分:2)

这是我想出的。您可以通过动态设置形状轻松地将其推广到更多列/行

import numpy as np
import pandas as pd

np_list = np.array(list2)
list_prep = np.transpose(np_list.reshape(2, 3))

df = pd.DataFrame(list_prep, index=['v1', 'v2', 'v3'], columns=['c1', 'c2'])

最终结果如下:

          c1        c2
v1 -0.146261 -0.853830
v2  0.017926  0.081825
v3  0.412654  0.402913

答案 1 :(得分:2)

要根据要创建的列数自动命名列,您可以:

from numpy import array
from pandas import DataFrame

rows = 3
cols = int(len(list2) / rows)

data = DataFrame(array(list2).reshape(cols, rows).T)
data.columns = ['Col{}'.format(i + 1) for i in range(cols)]
data.index = ['var{}'.format(i + 1) for i in range(rows)]

输出:

          Col1      Col2
var1 -0.146261 -0.853830
var2  0.017926  0.081825
var3  0.412654  0.402913

这涉及较少的列数/列名的硬编码。

您编辑过的有关绘图的问题完全是另外一回事,但是无论如何这里都是这样:

import matplotlib.pyplot as plt

plt.plot(data.columns, data.T)
plt.legend(data.index)
plt.show()

您的绘图应该看起来更好,因为您有更多的数据,但是示例数据只有两列:

plot

答案 2 :(得分:1)

您可以运行类似的

df = pd.DataFrame(index = ['var1', 'var2', 'var3'])

n_cols = int(np.ceil(len(list2) / len(df)))
for ii in range(n_cols):
    L = list2[ii * len(df) : (ii + 1) * len(df)]
    df['col_{}'.format(ii)] = L

如果列表的长度不是数据帧的长度的倍数(len(list2) % len(df) != 0,则应使用len(df) - (len(list2) % len(df)) NaN值扩展L(在最后一个循环中)

回答第二个问题,应该足以运行

df.T.plot()

对于第三个问题,这与最初设计数据框的方式有关。 您可以编辑我们在开始时编写的代码以反转行和列

df = pd.DataFrame(columns = ['var1', 'var2', 'var3'])
n_rows = int(np.ceil(len(list2) / len(df.columns)))
for ii in range(n_rows):
    L = list2[ii * len(df.columns) : (ii + 1) * len(df.columns)]
    df.loc['col_{}'.format(ii)] = L

但是一旦您采用第一种设计方式创建了数据框,运行就不会出错

df = df.T

答案 3 :(得分:0)

简单的解决方案


>>> pd.DataFrame({ 'a': list1, 'b': list2 })
          a         b
0 -0.146261 -0.146261
1  0.017926  0.017926
2  0.412654  0.412654
>>>

注意:请确保您等于列表1和列表2中的项目数。