pandas 按数字之和添加一列条柱

oyxsuwqo  于 2023-03-06  发布在  其他
关注(0)|答案(2)|浏览(109)

这是我的 Dataframe :

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。如果a中的值在103和106之间,我希望b列中的值为1。如果b中的值在106和109之间,我希望b列中的值为2。我希望像示例一样具有包容性。我尝试了几种解决方案。其中一种是pd.cut,但我不知道如何实现。这是我的一次尝试:

df['b'] = pd.cut(df.a, [100, 103, 106, 109], include_lowest=True)

但由于我不知道其他样本中有多少个bin,因此无法使用此解决方案。

xqkwcwgp

xqkwcwgp1#

一个选项不使用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
rur96b6h

rur96b6h2#

可以动态创建组,默认组从0开始添加参数labels=False,默认组从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

相关问题