如何将多列中的时间戳重新排列为单列python

时间:2018-07-13 02:02:52

标签: python pandas sorting dataframe merge

我正在尝试将timestamps columns中的多个pandas中的df排序为一个按时间排序的column

因此对于下面的df,我想将它们结合起来以创建一列

import pandas as pd

d = ({
    '' : ['Bar','Foo','Fubar'],
    'A' : ['8:00','8:29','8:58'],        
    'B' : ['8:30','8:59','9:28'],            
    'C' : ['9:00','9:29','10:00'], 
    })

df = pd.DataFrame(data=d)

输出:

             A     B      C
0    Bar  8:00  8:30   9:00
1    Foo  8:29  8:59   9:29
2  Fubar  8:58  9:28  10:00

预期输出:

       1  2      3
0    Bar  1   8:00
1    Foo  1   8:29
2    Bar  2   8:30
3  Fubar  1   8:58
4    Foo  2   8:59
5    Bar  3   9:00
6  Fubar  2   9:28
7    Foo  3   9:29
8  Fubar  3  10:00

我可以通过df = df.sort_values(by='1',ascending=True)对它们进行排序,但是我需要以某种方式合并它们。我试过了;

df =  df.sum(axis=1)

我也尝试过类似的加入方法,但结果总是

0       Bar8:008:309:00
1       Foo8:298:599:29
2    Fubar8:589:2810:00

更新:

使用@Wen的代码,我得到以下输出

df.columns=['',1,2,3]
df = pd.melt(df, '')
df = df.sort_values(by='value',ascending=True)

         variable  value
8  Fubar        3  10:00 #All ordered except for the first row?
0    Bar        1   8:00
1    Foo        1   8:29
3    Bar        2   8:30
2  Fubar        1   8:58
4    Foo        2   8:59
6    Bar        3   9:00
5  Fubar        2   9:28
7    Foo        3   9:29

除了第一行以外,其他所有商品都已订购?

2 个答案:

答案 0 :(得分:1)

IIUC

df.columns=['',1,2,3]
df.melt('')
Out[99]: 
         variable  value
0    Bar        1   8:00
1    Foo        1   8:29
2  Fubar        1   8:58
3    Bar        2   8:30
4    Foo        2   8:59
5  Fubar        2   9:28
6    Bar        3   9:00
7    Foo        3   9:29
8  Fubar        3  10:00

答案 1 :(得分:0)

尝试一下:

newdf = pd.DataFrame(np.repeat(df.T.values,3,axis=1)).T
newdf.columns=df.columns
newdf['new']=list(set(df['A']))+list(set(df['B']))+list(set(df['C']))
newdf['']=newdf[''][::3].tolist()*3
newdf['n']=sorted([1,2,3]*3)
newdf=newdf[['','n','new']]
print(newdf)

输出:

          n    new
0    Bar  1   8:00
1    Foo  1   8:29
2  Fubar  1   8:58
3    Bar  2   8:59
4    Foo  2   8:30
5  Fubar  2   9:28
6    Bar  3   9:00
7    Foo  3  10:00
8  Fubar  3   9:29