说我有一个看起来像这样的数据框:
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整除会发生什么。
答案 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]
。