将DataFrame分成N个(几乎)相等的段

时间:2018-12-05 21:43:36

标签: python pandas dataframe

说我有一个看起来像这样的数据框:

Id  ColA
1   2           
2   2        
3   3        
4   5        
5   10       
6   12       
7   18       
8   20       
9   25       
10  26          

我希望我的代码在DataFrame的末尾创建一个新列,该列将观测的总数除以5(从5到1)。

Id  ColA    Segment
1   2        5  
2   2        5
3   3        4
4   5        4
5   10       3
6   12       3
7   18       2
8   20       2
9   25       1
10  26       1  

我尝试了以下代码,但不起作用:

df['segment'] = pd.qcut(df['Id'],5)

我还想知道如果我的观察结果总数不能被5整除会发生什么。

2 个答案:

答案 0 :(得分:3)

实际上,您比您想的要接近答案。无论len(df)是否为5的倍数,都可以使用。

bins = 5
df['Segment'] = bins - pd.qcut(df['Id'], bins).cat.codes

df
   Id  ColA  Segment
0   1     2        5
1   2     2        5
2   3     3        4
3   4     5        4
4   5    10        3
5   6    12        3
6   7    18        2
7   8    20        2
8   9    25        1
9  10    26        1

在哪里

pd.qcut(df['Id'], bins).cat.codes

0    0
1    0
2    1
3    2
4    3
5    4
6    4
dtype: int8

pd.qcut返回的分类间隔表示为整数值。


另一个示例,对于具有 7 行的数据框。

df = df.head(7).copy()
df['Segment'] = bins - pd.qcut(df['Id'], bins).cat.codes

df

   Id  ColA  Segment
0   1     2        5
1   2     2        5
2   3     3        4
3   4     5        3
4   5    10        2
5   6    12        1
6   7    18        1

答案 1 :(得分:1)

这应该有效:

df['segment'] = np.linspace(1, 6, len(df), False, dtype=int)

它将创建一个数组大小为1到5之间的int列表。如果您想从5到1,只需在行尾添加[::-1]