我正在尝试将值分类到用于我的数据的某些自定义分类中。数据帧中的Coulmn1由一大组从1.4到1.9的随机数组成。假设初始数据帧如下所示:
Index Col1
1 1.4678
2 1.5001
3 1.5795
4 1.5234
... ......
98 1.6754
99 1.6399
100 1.4910
我想做的是将落在下面所列垃圾箱+/- 0.002之内的数字分类。即我要对第一个bin的所有位于1.458和1.462之内的数据进行bin。输出应如下所示
Index Col1 Bin_names
1 1.4678 NaN
2 1.5001 1.50
3 1.5795 1.58
4 1.5234 NaN
... ...... ....
98 1.6754 NaN
99 1.6399 1.64
100 1.4910 NaN
我尝试了下面的代码,但是将所有介于1.46到1.48之间的数据合并到一个容器中,这不是我想要的。
bins = [1.46,1.48,1.5,1.52,1.54,1.56,1.58,1.60,1.62,1.64,1.66,1.68,1.70]
df['Bin_names'] = pd.cut(df['Column1'], bins, labels=['1.48','1.5','1.52','1.54','1.56','1.58','1.60','1.62','1.64','1.66','1.68','1.70'])
如何根据我的需求对数据进行分类?
默认情况下,pd.cut()
的边界包含右边缘,因此您可以从标签“ 1.46”开始。
import pandas as pd
import numpy as np
import random
random.seed(10)
df = pd.DataFrame({'Col1':[round(random.uniform(1.450, 1.700),4) for i in range(100)]}, index=np.arange(1,101,1))
bins = [1.46,1.48,1.50,1.52,1.54,1.56,1.58,1.60,1.62,1.64,1.66,1.68,1.70]
labels = ['1.46','1.48','1.50','1.52','1.54','1.56','1.58','1.60','1.62','1.64','1.66','1.68']
df['Bin_names'] = pd.cut(df['Col1'], bins, labels=labels,right=False)
df.sort_values('Col1', inplace=True)
df2 = df.groupby('Bin_names').agg(list)
df3 = df2['Col1'].apply(pd.Series)
df3['cnt'] = df3.count(axis=1, numeric_only=True)
df3
0 1 2 3 4 5 6 7 8 9 10 11 cnt
Bin_names
1.46 1.4611 1.4611 1.4657 1.4662 1.4700 1.4742 1.4782 1.4799 NaN NaN NaN NaN 8
1.48 1.4832 1.4835 1.4874 1.4891 1.4901 1.4912 1.4914 1.4916 1.4946 NaN NaN NaN 9
1.50 1.5015 1.5061 1.5104 1.5114 1.5125 1.5187 NaN NaN NaN NaN NaN NaN 6
1.52 1.5209 1.5257 1.5286 1.5299 1.5319 1.5329 1.5369 NaN NaN NaN NaN NaN 7
1.54 1.5415 1.5435 1.5454 1.5476 1.5503 1.5532 1.5535 1.5551 1.5572 1.5583 1.5587 1.5590 12
1.56 1.5603 1.5620 1.5639 1.5642 1.5654 1.5700 1.5723 1.5725 1.5742 NaN NaN NaN 9
1.58 1.5800 1.5802 1.5813 1.5834 1.5847 1.5872 1.5918 1.5929 1.5945 1.5957 1.5961 1.5962 12
1.60 1.6003 1.6005 1.6008 1.6033 1.6043 1.6122 1.6134 1.6145 1.6155 1.6183 1.6187 NaN 11
1.62 1.6215 1.6281 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2
1.64 1.6420 1.6439 1.6444 1.6519 1.6533 1.6545 1.6553 1.6559 NaN NaN NaN NaN 8
1.66 1.6610 1.6638 1.6650 1.6674 1.6745 1.6776 NaN NaN NaN NaN NaN NaN 6
1.68 1.6853 1.6869 1.6882 1.6922 1.6923 1.6956 1.6991 NaN NaN NaN NaN NaN 7