Python 获取分组数据帧中最常出现的值

Python 获取分组数据帧中最常出现的值,python,pandas,Python,Pandas,我有这样一个DF: 日期显示员工人数 2018年8月16日868 200 2018年8月17日868150 2018年8月18日868 200 2018年8月16日776150 2018年8月17日776 250 2018年8月18日776150 现在,对于每个DIS_NR,必须使用出现次数最多的NUM_EMPLOYEES值作为基准,并且必须标记没有相同值的任何其他日期 最终数据应如下所示: 日期显示员工人数标志 8/16/2018 868 200 0 2018年8月17日868 150 1 2

我有这样一个DF:
日期显示员工人数

2018年8月16日868 200

2018年8月17日868150

2018年8月18日868 200

2018年8月16日776150

2018年8月17日776 250

2018年8月18日776150

现在,对于每个DIS_NR,必须使用出现次数最多的NUM_EMPLOYEES值作为基准,并且必须标记没有相同值的任何其他日期

最终数据应如下所示:

日期显示员工人数标志

8/16/2018 868 200 0

2018年8月17日868 150 1

2018年8月18日8682000

2018年8月16日776150

2018年8月17日776 250 1

2018年8月18日776150

我使用
df1=DF.groupby([“DIS_NR”,“Date”])

我试着在每一个上面循环并找到模式,但它不起作用。任何帮助都将不胜感激

多谢各位

DF[‘counts’]=1
df1 = DF.groupby(["DIS_NR", "Date"]).sum()
df1[df1[‘counts’]>1]=0
df1=df1.reset_index() 
DF=pd.merge(DF,df1,on=[“DIS_NR”, “Date”]) 
这些是关键步骤,合并后,您应该将counts列视为所需的附加列

我在电话上打这个,上面可能有语法错误

这些是关键步骤,合并后,您应该将counts列视为所需的附加列


我在电话上打这个,上面可能有语法错误

从您的问题来看,您似乎不知道分组中的
日期列:

>>> func = lambda s: s.ne(s.value_counts().idxmax()).astype(int)
>>> df['FLAG'] = df.groupby('DIS_NR')['NUM_EMPLOYEES'].apply(func)

>>> df
        Date  DIS_NR  NUM_EMPLOYEES  FLAG
0 2018-08-16     868            200     0
1 2018-08-17     868            150     1
2 2018-08-18     868            200     0
3 2018-08-16     776            150     0
4 2018-08-17     776            250     1
5 2018-08-18     776            150     0
groupby()。(而不需要在Python中执行。)

将函数传递给
.transform()
时,它将应用于每个子集系列,您可以使用
.get\u groups()
查看这些系列:


更新:

例如,如果DIS_NR 825具有值(125243221),则应标记所有值

在这种情况下,可以对唯一值的数量进行第二个条件测试。请注意,您使用的是
.transform()
而不是
.apply()


从您的问题来看,您似乎对分组中的
Date
列不可知:

>>> func = lambda s: s.ne(s.value_counts().idxmax()).astype(int)
>>> df['FLAG'] = df.groupby('DIS_NR')['NUM_EMPLOYEES'].apply(func)

>>> df
        Date  DIS_NR  NUM_EMPLOYEES  FLAG
0 2018-08-16     868            200     0
1 2018-08-17     868            150     1
2 2018-08-18     868            200     0
3 2018-08-16     776            150     0
4 2018-08-17     776            250     1
5 2018-08-18     776            150     0
groupby()。(而不需要在Python中执行。)

将函数传递给
.transform()
时,它将应用于每个子集系列,您可以使用
.get\u groups()
查看这些系列:


更新:

例如,如果DIS_NR 825具有值(125243221),则应标记所有值

在这种情况下,可以对唯一值的数量进行第二个条件测试。请注意,您使用的是
.transform()
而不是
.apply()


是否需要用最大金额标记所有日期?或者需要其他东西?标记每个区域小于最频繁值的所有日期是否需要标记所有具有最大和的日期?或者需要其他东西?为每个地区标记少于最频繁值的所有日期是的,我同意,这需要OP.Hi Brad,除非一个地区中的所有值都不同,否则这是有效的。例如,如果DIS_NR 825有值(125243221),则应标记所有值。是的,我同意,这需要OP.Hi Brad,除非一个地区中的所有值都不同,否则该选项有效。例如,如果DIS_NR 825具有值(125243221),则应标记所有值。
>>> df
        Date  DIS_NR  NUM_EMPLOYEES
0 2018-08-16     868            200
1 2018-08-17     868            150
2 2018-08-18     868            200
3 2018-08-16     776            150
4 2018-08-17     776            250
5 2018-08-18     776            150
6 2018-08-16     825            100
7 2018-08-17     825            100
8 2018-08-18     825            100
func = lambda s: np.where(
    s.nunique() == 1, 1,
    s.ne(s.value_counts().idxmax()).astype(int)
)

>>> df.groupby('DIS_NR')['NUM_EMPLOYEES'].transform(func)
0    0
1    1
2    0
3    0
4    1
5    0
6    1
7    1
8    1
Name: NUM_EMPLOYEES, dtype: int64