如何在熊猫中设置列

时间:2019-07-01 20:15:50

标签: python pandas dataframe

这是我的数据框:

            Dec-18  Jan-19  Feb-19  Mar-19  Apr-19  May-19
Saturday    2540.0  2441.0  3832.0  4093.0  1455.0  2552.0
Sunday      1313.0  1891.0  2968.0  2260.0  1454.0  1798.0
Monday      1360.0  1558.0  2967.0  2156.0  1564.0  1752.0
Tuesday     1089.0  2105.0  2476.0  1577.0  1744.0  1457.0
Wednesday   1329.0  1658.0  2073.0  2403.0  1231.0  874.0
Thursday    798.0   1195.0  2183.0  1287.0  1460.0  1269.0

我尝试了一些大熊猫行动,但我无法做到这一点。

这就是我想要做的:

             items
Saturday    2540.0  
Sunday      1313.0  
Monday      1360.0  
Tuesday     1089.0  
Wednesday   1329.0  
Thursday    798.0   
Saturday    2441.0  
Sunday      1891.0  
Monday      1558.0  
Tuesday     2105.0  
Wednesday   1658.0  
Thursday    1195.0   ............ and so on 

我想将这些行设置为不利的行,该怎么做?

3 个答案:

答案 0 :(得分:9)

df.reset_index().melt(id_vars='index').drop('variable',1)

输出:

       index   value
0    Saturday  2540.0
1      Sunday  1313.0
2      Monday  1360.0
3     Tuesday  1089.0
4   Wednesday  1329.0
5    Thursday   798.0
6    Saturday  2441.0
7      Sunday  1891.0
8      Monday  1558.0
9     Tuesday  2105.0
10  Wednesday  1658.0
11   Thursday  1195.0
12   Saturday  3832.0
13     Sunday  2968.0
14     Monday  2967.0
15    Tuesday  2476.0
16  Wednesday  2073.0
17   Thursday  2183.0
18   Saturday  4093.0
19     Sunday  2260.0
20     Monday  2156.0
21    Tuesday  1577.0
22  Wednesday  2403.0
23   Thursday  1287.0
24   Saturday  1455.0
25     Sunday  1454.0
26     Monday  1564.0
27    Tuesday  1744.0
28  Wednesday  1231.0
29   Thursday  1460.0
30   Saturday  2552.0
31     Sunday  1798.0
32     Monday  1752.0
33    Tuesday  1457.0
34  Wednesday   874.0
35   Thursday  1269.0

注意:刚注意到一条建议做同样事情的评论,如果需要,我将删除我的帖子:)

答案 1 :(得分:8)

通过重塑数据,使用numpy创建它。

import pandas as pd
import numpy as np

pd.DataFrame(df.to_numpy().flatten('F'), 
             index=np.tile(df.index, df.shape[1]), 
             columns=['items'])

输出:

            items
Saturday   2540.0
Sunday     1313.0
Monday     1360.0
Tuesday    1089.0
Wednesday  1329.0
Thursday    798.0
Saturday   2441.0
...
Sunday     1798.0
Monday     1752.0
Tuesday    1457.0
Wednesday   874.0
Thursday   1269.0

答案 2 :(得分:4)

您可以这样做:

df = df.stack().sort_index(level=1).reset_index(level = 1, drop=True).to_frame('items')

有趣的是,尽管这种方法是最快的,但它却被忽略了:

import time
start = time.time()
df.stack().sort_index(level=1).reset_index(level = 1, drop=True).to_frame('items')
end = time.time()
print("time taken {}".format(end-start))

收益:time taken 0.006181955337524414

与此同时:

start = time.time()
df.reset_index().melt(id_vars='days').drop('variable',1)
end = time.time()
print("time taken {}".format(end-start))

收益:time taken 0.010072708129882812

任何我的输出格式都完全符合OP的要求。