Python 对熊猫数据进行数字分类

Python 对熊猫数据进行数字分类,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我试图查看一些参考资料,在那里我可以创建一个额外的列,该列基于另一列进行分类。我已经试过文档了,堆栈溢出似乎没有,但我想一定有,但可能我使用了错误的搜索标记 比如说 Size Size_cat 10 0-50 50 0-50 150 50-500 450 50-500 5000 1000-9000 10000 >9000 notice that the size category 500-1000 is missing (but no n

我试图查看一些参考资料,在那里我可以创建一个额外的列,该列基于另一列进行分类。我已经试过文档了,堆栈溢出似乎没有,但我想一定有,但可能我使用了错误的搜索标记

比如说

Size    Size_cat
10      0-50
50      0-50
150     50-500
450     50-500
5000    1000-9000
10000   >9000
notice that the size category 500-1000 is missing (but no number corresponds to that)
这里的问题是,我稍后创建了一个pandas交叉表,如下所示:

summary_table = pd.crosstab(index[res_sum["Type"],res_sum["Size"]],columns=[res_sum["Found"]],margins=True)
summary_table = summary_table.div(summary_table["All"] / 100, axis=0)
对该表进行一些编辑后,我得到了这样的结果:

Found                 Exact        Near          No
Type        Size                                   
DEL         50        80         20            0
            100       60         40            0
            500       80         20            0
            1000      60         40            0
            5000      40         60            0
            10000     20         80            0
DEL_Total             56.666667   43.333333    0
DUP         50         0           0         100
            100        0           0         100
            500        0         100           0
            1000       0         100           0
            5000       0         100           0
            10000     20          80           0
DUP_Total              3.333333   63.333333   33.333333
问题是,现在(Size)只是将大小放在这里,因此此表的大小可能会有所不同。如果数据中缺少5000-DEL,该列也将消失,然后DUP有6个类别和DEL 5。此外,如果我添加更多的尺寸,这个表将变得非常大。所以我想对大小进行分类,但始终保留相同的分类,即使其中一些是空的

我希望我清楚,因为这有点难以解释。 这是我已经尝试过的:

highest_size = res['Size'].max()
categories = int(math.ceil(highest_size / 100.0) * 100.0)
categories = int(categories / 10)

labels = ["{0} - {1}".format(i, i + categories) for i in range(0, highest_size, categories)]
print(highest_size)
print(categories)
print(labels)
10000
1000
['0 - 1000', '1000 - 2000', '2000 - 3000', '3000 - 4000', '4000 - 5000', '5000 - 6000', '6000 - 7000', '7000 - 8000', '8000 - 9000', '9000 - 10000']
我得到了数字类别,但当然现在它们取决于最高的数字,并且类别根据数据而变化。此外,我还需要将它们链接到熊猫中的“大小”列。这是行不通的

df['group'] = pd.cut(df.value, range(0, highest_size), right=False, labels=labels)

如果可能的话,我想创建自己的类别,而不是像上面第一个示例中那样使用range来获得相同的步骤。(否则,如果步数为100,则需要很长时间才能达到10000,而如果步数为1000,则会在较小的区域丢失大量数据)

请参见下面的模型,以帮助您获得逻辑。基本上,您可以使用
cut
(甚至
lambda
map
)并将值传递给函数
GroupMapping
,将分数分为自定义组。让我知道它是否有效

import pandas as pd
df=pd.DataFrame({
        'Name':['Harry','Sally','Mary','John','Francis','Devon','James','Holly','Molly','Nancy','Ben'], 
        'Score': [1143,2040,2500,3300,3143,2330,2670,2140,2890,3493,1723]}
    )

def GroupMapping(dl):
    if int(dl) <= 1000: return '0-1000'
    elif 1000 < dl <= 2000: return '1000 - 2000'
    elif 2000 < dl <= 3000: return '2000 - 3000'
    elif 3000 < dl <= 4000: return '3000 - 4000'
    else: return 'None'

#df["Group"] = df['Score'].map(GroupMapping)
#df["Group"] = df['Score'].apply(lambda row: GroupMapping(row))
df['Group'] = pd.cut(df['Score'], [0, 1000, 2000, 3000, 4000], labels=['0-1000', '1000 - 2000', '2000 - 3000','3000 - 4000' ])
df
将熊猫作为pd导入
df=pd.DataFrame({
‘姓名’:[‘哈里’、‘莎莉’、‘玛丽’、‘约翰’、‘弗朗西斯’、‘德文’、‘詹姆斯’、‘霍莉’、‘茉莉’、‘南希’、‘本’],
‘得分’:[11432040250033003143233026702140289034931723]}
)
def组映射(dl):

如果int(dl)不能使用lambda在初始数据帧和交叉表上创建一个Size_cat列?听起来很简单:),那么如何使用lambda?我将在下面做一个快速模拟。我会尝试一下,我会让你知道的好的。另一个选项是使用cut:df['bin']=pd.cut(df['Score'],[0,1000,2000,3000,4000],labels=['0-1000','1000-2000','2000-3000','3000-4000'])它可以正常工作,但还不能完全正常工作。我得到了类别“group”,但只有类别0-1000正确生成,其他所有类别均为NaN。我试图通过将
int(d1)
放在所有地方(而不仅仅是第一个if)和两侧
来“修复”您的代码。使用pd.cut的第二个选项非常有效。明天我将尝试将该代码实现到我自己的代码中:),但我仍然可能有一个问题,即某些类别现在不存在,如果该数字在任何类别中都不存在……非常好的反馈@Fini。我更新了答案以反映该方法。