如何在python中按模式分组?

如何在python中按模式分组?,python,pandas,scipy,Python,Pandas,Scipy,我试图通过使用下面的数据框,根据模式查找项目属于哪个类别 资料 我想弄清楚的是,通过获取我想要根据类别模式为每个唯一项目分配类别的唯一项目 预期产出: ITEM CATEGORY 1 red saree actual 2 glass lbh 3 bottle actual 请告诉我如何在python中找到答案,提前谢谢 尝试: import pandas as pd from scipy.stats import mode data_

我试图通过使用下面的数据框,根据模式查找项目属于哪个类别

资料

我想弄清楚的是,通过获取我想要根据类别模式为每个唯一项目分配类别的唯一项目

预期产出:

  ITEM          CATEGORY
1 red saree     actual
2 glass         lbh
3 bottle        actual
请告诉我如何在python中找到答案,提前谢谢

尝试:

import pandas as pd
from scipy.stats import mode
data_x = map(mode, data['category'])

我知道它甚至与此无关,但找不到如何为该

编写代码。您可以将“ITEM”和“CATEGORY”列分组,然后在df groupby对象上调用
apply
,并传递函数。然后我们可以调用
reset_index
并传递param
drop=True
,这样多索引就不会作为列添加回去,因为您已经有了这些列:

In [161]:

df.groupby(['ITEM', 'CATEGORY']).apply(pd.DataFrame.mode).reset_index(drop=True)
Out[161]:
        ITEM CATEGORY
0     bottle   actual
1      glass      lbh
2  red saree   actual

您可以将“ITEM”和“CATEGORY”列分组,然后在df groupby对象上调用
apply
,并传递函数。然后我们可以调用
reset_index
并传递param
drop=True
,这样多索引就不会作为列添加回去,因为您已经有了这些列:

In [161]:

df.groupby(['ITEM', 'CATEGORY']).apply(pd.DataFrame.mode).reset_index(drop=True)
Out[161]:
        ITEM CATEGORY
0     bottle   actual
1      glass      lbh
2  red saree   actual

由于您已经在使用Pandas,如果您对SQL更熟悉,您可以尝试
pandasql
并使用它

from pandasql import sqldf
pysqldf = lambda q: sqldf(q, globals())

q = """
select 
    item, 
    category, 
    count(*) as cnt
from df
group by item, category
"""

df_counts = pysqldf(q)

q1 = """
select b.item, b.category 
from 
    (select 
        item, 
        max(cnt) as max_cnt
    from df_counts
    group by item) as a
    inner join df_counts as b
        on a.item = b.item 
            and a.max_cnt = b.cnt
"""
对于输出:

>>> pysqldf(q1)
        item category
0  bottle      actual
1  glass          lbh
2  red saree   actual

由于您已经在使用Pandas,如果您对SQL更熟悉,您可以尝试
pandasql
并使用它

from pandasql import sqldf
pysqldf = lambda q: sqldf(q, globals())

q = """
select 
    item, 
    category, 
    count(*) as cnt
from df
group by item, category
"""

df_counts = pysqldf(q)

q1 = """
select b.item, b.category 
from 
    (select 
        item, 
        max(cnt) as max_cnt
    from df_counts
    group by item) as a
    inner join df_counts as b
        on a.item = b.item 
            and a.max_cnt = b.cnt
"""
对于输出:

>>> pysqldf(q1)
        item category
0  bottle      actual
1  glass          lbh
2  red saree   actual

7-glass-actual
去了哪里?我想问的是,我们有一个具有3个类别(实际、lbh、lbh)的项目(玻璃),那么项目(玻璃)的类别模式是lbh。我如何使用python分配它是
lbh
而不是
actual
?7 glass actual去了哪里?我要问的是,我们有一个具有3个类别(实际、lbh、lbh)的项目(玻璃),那么项目(玻璃)的类别模式是lbh。我如何使用python分配它是
lbh
而不是
actual
?谢谢你的回答!但我应该说,例如:如果我们有值,而不是类别可变的类型。我需要从中找出最大值。例如:我们有一个项目(玻璃)有3个值(1.5,2.5,3.5),那么项目(玻璃)的最大类别是3.5。然后我需要说3.5属于“实际”或“LBH”。我怎样才能找到它python@surendra这是一个新问题,请作为一个全新的问题发布,谢谢你的回答!但我应该说,例如:如果我们有值,而不是类别可变的类型。我需要从中找出最大值。例如:我们有一个项目(玻璃)有3个值(1.5,2.5,3.5),那么项目(玻璃)的最大类别是3.5。然后我需要说3.5属于“实际”或“LBH”。我怎样才能找到它python@surendra这是一个新问题,请作为一个全新的问题发布,谢谢