我有以下列表:
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
中使用的数据结构。是每行需要一个测量值吗?
我的想法是在x轴上具有col1
,col2
,col3
(这是一个时间序列)。在y轴上,值的范围(在该图中可以)和differnetnet线应显示var1
,var2
,var3
等的演变。>
答案 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()
您的绘图应该看起来更好,因为您有更多的数据,但是示例数据只有两列:
答案 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中的项目数。