【问题标题】:python, pandas, dataframe, rows to columnspython,熊猫,数据框,行到列
【发布时间】:2016-09-14 13:52:19
【问题描述】:

我从一个组织不善的 SQL 表中提取了一个数据框。该表对每个频道都有唯一的行 我可以将该信息提取到 python 数据帧中,并打算进行进一步处理,但现在只想将其转换为更可用的格式

样本输入:

C = pd.DataFrame()
A = np.array([datetime.datetime(2016,8,8,0,0,1,1000),45,'foo1',1])
B = pd.DataFrame(A.reshape(1,4),columns = ['date','chNum','chNam','value'])
C = C.append(B)
A = np.array([datetime.datetime(2016,8,8,0,0,1,1000),46,'foo2',12.3])
B = pd.DataFrame(A.reshape(1,4),columns = ['date','chNum','chNam','value'])
C = C.append(B)
A = np.array([datetime.datetime(2016,8,8,0,0,2,1000),45,'foo1',10])
B = pd.DataFrame(A.reshape(1,4),columns = ['date','chNum','chNam','value'])
C = C.append(B)
A = np.array([datetime.datetime(2016,8,8,0,0,2,1000),46,'foo2',11.3])
B = pd.DataFrame(A.reshape(1,4),columns = ['date','chNum','chNam','value'])
C = C.append(B)

生产

                             date chNum chNam value
0  2016-08-08 00:00:01.001000    45  foo1     1
0  2016-08-08 00:00:01.001000    46  foo2  12.3
0  2016-08-08 00:00:02.001000    45  foo1    10
0  2016-08-08 00:00:02.001000    46  foo2  11.3

我想要

                                 date foo1     foo2  
2016-08-08 00:00:01.001000           1     12.3
2016-08-08 00:00:02.001000           10   113

我有一个解决方案:创建一个唯一日期列表,每个日期循环通过数据框并拉出每个通道,创建一个新行。有点乏味(容易出错)!编程,所以我想知道是否有更好的方法来利用 Pandas 工具

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    使用set_index 然后unstack 进行旋转

    C.set_index(['date', 'chNum', 'chNam'])['value'].unstack(['chNam', 'chNum'])
    


    为了得到你想要的东西

    C.set_index(['date', 'chNam'])['value'].unstack().rename_axis(None, 1)
    

    【讨论】:

      猜你喜欢
      • 2020-06-03
      • 2016-07-27
      • 2016-08-20
      • 2018-03-07
      • 1970-01-01
      • 2020-07-23
      • 1970-01-01
      • 1970-01-01
      • 2022-12-10
      相关资源
      最近更新 更多