这是我的数据框:
df = pd.DataFrame({'a': range(100, 111)})
我想在此数据框中添加一列。我想要的输出是这样的:
a b
0 100 NaN
1 101 NaN
2 102 NaN
3 103 1
4 104 1
5 105 1
6 106 2
7 107 2
8 108 2
9 109 3
10 110 3
我有一个值,在这种情况下为 3。如果
b
中的值介于 103 和 106 之间,我想要 a
中的 1。如果值介于 106 和 109 之间,我想要 b
中的 2。我想要像例子一样的包容性。
我尝试了几种解决方案。其中之一是pd.cut
,但我不知道该怎么做。这是我的尝试之一:
df['b'] = pd.cut(df.a, [100, 103, 106, 109], include_lowest=True)
但是因为我不知道我的其他样本中有多少个 bin,所以我不能使用这个解决方案。
cut
,但简单算术(地板除法)的选项:
N = 3
start = df['a'].min()+N
s = df['a'].sub(start).floordiv(N).add(1)
df['b'] = s.where(s.gt(0))
# or in one line
df['b'] = df['a'].sub(start).floordiv(N).add(1).where(df['a'].ge(start))
cut
:
N = 3
start = df['a'].min()+N
end = df['a'].max()
df['b'] = pd.cut(df['a'], np.arange(start, end+N, N),
labels=range(1, (end-start)//N+2), right=False)
输出:
a b
0 100 NaN
1 101 NaN
2 102 NaN
3 103 1.0
4 104 1.0
5 105 1.0
6 106 2.0
7 107 2.0
8 108 2.0
9 109 3.0
10 110 3.0
您可以动态创建组并为默认组添加参数
labels=False
,以0
开始,添加1
以1
开始:
N = 3
bins = np.arange(df.a.min() + N, df.a.max() + N, N)
print (bins)
[103 106 109 112]
df['b'] = pd.cut(df.a, bins, labels=False, include_lowest=True, right=False) + 1
print (df)
a b
0 100 NaN
1 101 NaN
2 102 NaN
3 103 1.0
4 104 1.0
5 105 1.0
6 106 2.0
7 107 2.0
8 108 2.0
9 109 3.0
10 110 3.0