【问题标题】:How to convert time-series dataset into a pandas dataframe如何将时间序列数据集转换为熊猫数据框
【发布时间】:2019-07-22 21:49:40
【问题描述】:

我有如下四个列表,其中每个 node 有 6 个时间序列值,这些值根据 2001 年至 2006 年的年份排序(即20012002200320042005 , 2006)。

mylist1 = [['node1', 3.2, 4.5, 6.8, 7.6, 8.8, 9.6], ['node2', 6.2, 9.5, 2.8, 8.6, 1.8, 8.6]]

mylist2 = [['node1', 3, 4, 6, 7, 8, 9], ['node2', 6, 9, 2, 8, 1, 8]]

mylist3 = [['node1', 3.6, 4.2, 6.6, 7.8, 8.9, 9.5], ['node2', 6.8, 9.9, 2.5, 8.2, 1.6, 8.2]]

mylist4 = [['node1', 2, 5, 8, 6, 8, 6], ['node2', 2, 5, 8, 6, 8, 6]]

我想把上面的4个列表转换成下面的pandas数据框。

id     year    mylist1  mylist2  mylist3  mylist4
node1  2001    3.2      3        3.6       2
node1  2002    4.5      4        4.2       5
node1  2003    6.8      6        6.6       8
node1  2004    7.6      7        7.8       6
node1  2005    8.8      8        8.9       8
node1  2006    9.6      9        9.5       6
node2  2001    6.2      6        6.8       2
node2  2002    9.5      9        9.9       5
node2  2003    2.8      2        2.5       8
node2  2004    8.6      8        8.2       6
node2  2005    1.8      1        1.6       8
node2  2006    8.6      8        8.2       6 

我将列表转换为 pandas 数据框,如下所示。

df1 = pd.DataFrame(list(mylist1))
df2 = pd.DataFrame(list(mylist2))
df3 = pd.DataFrame(list(mylist3))
df4 = pd.DataFrame(list(mylist4))

但是,我不确定如何连接这些数据帧以获得时间序列的垂直对齐,如上所示。

如果需要,我很乐意提供更多详细信息。

【问题讨论】:

  • pd.DataFrame(mylist1+mylist2+mylist3+mylist4) 应该可以,没有看到年份数据
  • @iamklaus 实际上列表中的值是按年份顺序排列的(即 2001、2002、2003、2004、2005、2006)

标签: pandas


【解决方案1】:

尝试:

from functools  import reduce
lists = [mylist1, mylist2, mylist3, mylist4]
dfs = [pd.DataFrame(mylist).melt(id_vars = [0]).loc[:,[0, 'value']].rename(columns = \
                                    {"value":'mylist{}'.format(i+1), 0:'id'}) \
                                   for i, mylist in enumerate(lists)]
df_final = reduce(lambda left,right: pd.merge(left,right.pop(right.columns[1]).to_frame(),\
                                             left_index= True, right_index = True), dfs)
df_final = df_final.sort_values('id').reset_index(drop = True)

结果如下:

    id  mylist1 mylist2 mylist3 mylist4
0   node1   3.2 3   3.6 2
2   node1   4.5 4   4.2 5
4   node1   6.8 6   6.6 8
6   node1   7.6 7   7.8 6
8   node1   8.8 8   8.9 8
10  node1   9.6 9   9.5 6
1   node2   6.2 6   6.8 2
3   node2   9.5 9   9.9 5
5   node2   2.8 2   2.5 8
7   node2   8.6 8   8.2 6
9   node2   1.8 1   1.6 8
11  node2   8.6 8   8.2 6

你可以在之后添加年份:

year_col = [2001, 2002, 2003, 2004, 2005, 2006]
df_final['year'] = year_col * 2

【讨论】:

  • 嗨,我现在可以运行你的代码了。好像我在df final = reduce()ValueError: can not merge DataFrame with instance of type <class 'pandas.core.series.Series'> 一样收到了错误。有没有办法解决这个问题? :)
  • 有点奇怪,我测试了一下,运行正常,你是在什么版本的pandas上运行的?
  • 我编辑了我的答案,也许它现在也适用于你的熊猫版本,我在合并之前将 right.pop(right.columns[1]) 转换为数据框
  • 感谢 cmets。我使用的熊猫版本是'0.23.4'。你的是什么? :)
  • 我的是0.24.2,但我想现在我已经编辑过了
【解决方案2】:

我使用MultiIndex 作为索引。从每个 mylistnode 的名称创建多索引。使用所有 mylist 的 concat 创建一个数据框,并将索引分配为多索引。最后,unstack、删除不需要的列、转置、sort_index 和删除不需要的索引级别:

l1 = ['mylist1','mylist2','mylist3','mylist4']
l2 = ['node1', 'node2']
idx = pd.MultiIndex.from_product([l1, l2])

(pd.DataFrame(mylist1+mylist2+mylist3+mylist4, index=idx).drop(0,1).unstack().T 
            .sort_index(level=1).droplevel(0))
Out[283]:
       mylist1  mylist2  mylist3  mylist4
node1      3.2      3.0      3.6      2.0
node1      4.5      4.0      4.2      5.0
node1      6.8      6.0      6.6      8.0
node1      7.6      7.0      7.8      6.0
node1      8.8      8.0      8.9      8.0
node1      9.6      9.0      9.5      6.0
node2      6.2      6.0      6.8      2.0
node2      9.5      9.0      9.9      5.0
node2      2.8      2.0      2.5      8.0
node2      8.6      8.0      8.2      6.0
node2      1.8      1.0      1.6      8.0
node2      8.6      8.0      8.2      6.0

【讨论】:

  • 嗨,我收到一条错误消息:AttributeError: 'DataFrame' object has no attribute 'droplevel'。有没有办法解决这个问题? :)
  • 表示你的 pandas 版本 droplevel(0) 更改为reset_index(level=0, drop=True)
【解决方案3】:

另一种方法

df = pd.DataFrame(mylist1+mylist2+mylist3+mylist4).sort_values(0).reset_index(drop=True)
first_half = a.loc[:3,1:].T
second_half = a.loc[4:,1:].T
first_half['id'] = 'node1'
first_half['year'] = np.arange(2001,2007)
second_half['id'] = 'node2'
second_half['year'] = np.arange(2001,2007)

master = pd.concat([first_half,second_half]).reset_index(drop=True)
master = master[['id','year',0,1,2,3]]
master.columns = ['id','year','mylist1','mylist2','mylist3','mylist4']
##master

输出

       id  year  mylist1  mylist2  mylist3  mylist4
0   node1  2001      3.2      3.0      3.6      2.0
1   node1  2002      4.5      4.0      4.2      5.0
2   node1  2003      6.8      6.0      6.6      8.0
3   node1  2004      7.6      7.0      7.8      6.0
4   node1  2005      8.8      8.0      8.9      8.0
5   node1  2006      9.6      9.0      9.5      6.0
6   node2  2001      6.2      6.0      6.8      2.0
7   node2  2002      9.5      9.0      9.9      5.0
8   node2  2003      2.8      2.0      2.5      8.0
9   node2  2004      8.6      8.0      8.2      6.0
10  node2  2005      1.8      1.0      1.6      8.0
11  node2  2006      8.6      8.0      8.2      6.0

【讨论】:

    猜你喜欢
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2019-05-22
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多