如何生成一个新的Pandas数据框,我将一些行压缩到一个新列?

时间:2017-08-20 09:21:39

标签: python pandas dataframe time-series

我对pandas DataFrame相当新,但我一直在观看教程和阅读有关它的文档,我无法完全找到一种方法来做我想要的。我有一个按时间戳索引的DataFrame,我想将一段时间换成一行。图形:

<div class="d1">
<p>Items:</p>
<lu>
  <li>item1</li>
  <li>item2</li>
  <li><span class="s1">item3</span></li>
 </lu>
 </div>

这导致

    # start date of the series
start_date='20130101'
# range of dates
dates = pd.date_range(start_date, periods=6)

# random dataframe
df = pd.DataFrame([["(1,1)","(1,2)"],
                   ["(2,1)","(2,2)"],
                   ["(3,1)","(3,2)"],
                   ["(4,1)","(4,2)"],
                   ["(5,1)","(5,2)"],
                   ["(6,1)","(6,2)"]], index=dates, columns=list('AB'))
print(df)
# range of bucketing periods, in this case I will get just three periods covering two days each
rng = pd.period_range(start_date, periods=3,freq='2D')

我想要做的是现在生成一个新的数据框,其中我将 A B 2013-01-01 (1,1) (1,2) 2013-01-02 (2,1) (2,2) 2013-01-03 (3,1) (3,2) 2013-01-04 (4,1) (4,2) 2013-01-05 (5,1) (5,2) 2013-01-06 (6,1) (6,2) 中的句点作为索引,并将与该句点对应的行作为连续列:

rng = pd.period_range(start_date, periods=3,freq='2D')

Api中有什么方法可以用来做这个吗? 我想我还需要生成新的标签,如A1,B1。

另外,在我想了一下之后,我可以用

              A      B      A1      B1
2013-01-01  (1,1)  (1,2)  (2,1)  (2,2)            
2013-01-03  (3,1)  (3,2)  (4,1)  (4,2)  
2013-01-05  (5,1)  (5,2)  (6,1)  (6,2)

1 个答案:

答案 0 :(得分:2)

其中一种方法是将期间转换为timestamp并制作数据框,然后通过NaN方法将ffilln = pd.DataFrame(rng.to_timestamp()).set_index(rng.to_timestamp()) result = pd.concat([df, n], axis=1).fillna(method='ffill').set_index(0) result = result.set_index(result.groupby(level=0).cumcount(), append=True).unstack() 方法相结合,并通过设置新的时间戳来reshape based on index列作为索引即

reqsByCA(ca.id.get) += req

输出

                A             B       
                0      1      0      1
0                                     
2013-01-01  (1,1)  (2,1)  (1,2)  (2,2)
2013-01-03  (3,1)  (4,1)  (3,2)  (4,2)
2013-01-05  (5,1)  (6,1)  (5,2)  (6,2)
In [1024]: