Python 将列中的0替换为列中的groupby中位数
我有一个数据框,如下所示。这是2016年12月至2018年11月两种保健产品的销售数据Python 将列中的0替换为列中的groupby中位数,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我有一个数据框,如下所示。这是2016年12月至2018年11月两种保健产品的销售数据 product profit bougt_date discount salary A 50 2016-12-01 5 25 A 50 2017-01-03 4 20 B 200 2016-12-24
product profit bougt_date discount salary
A 50 2016-12-01 5 25
A 50 2017-01-03 4 20
B 200 2016-12-24 10 100
A 50 2017-01-18 3 0
B 200 2017-01-28 15 80
A 50 2017-01-18 6 15
B 200 2017-01-28 20 0
A 50 2017-04-18 6 0
B 200 2017-12-08 25 0
A 50 2017-11-18 6 20
B 200 2017-08-21 20 90
B 200 2017-12-28 30 110
A 50 2018-03-18 10 0
B 300 2018-06-08 45 100
B 300 2018-09-20 50 60
A 50 2018-11-18 8 45
B 300 2018-11-28 35 0
从上面我想用列乘积的groupby中位数替换0 salary
说明:
A : 15, 20, 20, 25, 45
So the median = 20.
B : 60, 80, 90, 100, 100, 110
So the median = 95.
预期产量
product profit bougt_date discount salary
A 50 2016-12-01 5 25
A 50 2017-01-03 4 20
B 200 2016-12-24 10 100
A 50 2017-01-18 3 20
B 200 2017-01-28 15 80
A 50 2017-01-18 6 15
B 200 2017-01-28 20 95
A 50 2017-04-18 6 20
B 200 2017-12-08 25 95
A 50 2017-11-18 6 20
B 200 2017-08-21 20 90
B 200 2017-12-28 30 110
A 50 2018-03-18 10 20
B 300 2018-06-08 45 100
B 300 2018-09-20 50 60
A 50 2018-11-18 8 45
B 300 2018-11-28 35 95
首先使用.groupby和.transform列以显示按中间值分组的列。最后,使用.loc查找0的薪资,并将其设置为薪资中值
#NOTE - the below line of code uses `median` instead of `np.nanmedian`. These will return different results...
#To anyone reading this, please know which one to use according to your situation...
#As you can see the outputs are different between Chester's answer and mine.
df.loc[df['salary'] == 0, 'salary'] = df.groupby('product')['salary'].transform('median')
df
输出:
product profit bougt_date discount salary
0 A 50 2016-12-01 5 25.0
1 A 50 2017-01-03 4 20.0
2 B 200 2016-12-24 10 100.0
3 A 50 2017-01-18 3 17.5
4 B 200 2017-01-28 15 80.0
5 A 50 2017-01-18 6 15.0
6 B 200 2017-01-28 20 80.0
7 A 50 2017-04-18 6 17.5
8 B 200 2017-12-08 25 80.0
9 A 50 2017-11-18 6 20.0
10 B 200 2017-08-21 20 90.0
11 B 200 2017-12-28 30 110.0
12 A 50 2018-03-18 10 17.5
13 B 300 2018-06-08 45 100.0
14 B 300 2018-09-20 50 60.0
15 A 50 2018-11-18 8 45.0
16 B 300 2018-11-28 35 80.0
首先使用.groupby和.transform列以显示按中间值分组的列。最后,使用.loc查找0的薪资,并将其设置为薪资中值
#NOTE - the below line of code uses `median` instead of `np.nanmedian`. These will return different results...
#To anyone reading this, please know which one to use according to your situation...
#As you can see the outputs are different between Chester's answer and mine.
df.loc[df['salary'] == 0, 'salary'] = df.groupby('product')['salary'].transform('median')
df
输出:
product profit bougt_date discount salary
0 A 50 2016-12-01 5 25.0
1 A 50 2017-01-03 4 20.0
2 B 200 2016-12-24 10 100.0
3 A 50 2017-01-18 3 17.5
4 B 200 2017-01-28 15 80.0
5 A 50 2017-01-18 6 15.0
6 B 200 2017-01-28 20 80.0
7 A 50 2017-04-18 6 17.5
8 B 200 2017-12-08 25 80.0
9 A 50 2017-11-18 6 20.0
10 B 200 2017-08-21 20 90.0
11 B 200 2017-12-28 30 110.0
12 A 50 2018-03-18 10 17.5
13 B 300 2018-06-08 45 100.0
14 B 300 2018-09-20 50 60.0
15 A 50 2018-11-18 8 45.0
16 B 300 2018-11-28 35 80.0
您可以尝试使用屏蔽0值并在此处使用 或 使用
您可以尝试使用屏蔽0值并在此处使用 或 使用
不知道为什么这被否决了:不过这应该会起作用。这给出了错误的输出,对吗?你得到的中位数是17.5和80.0,但不确定为什么输出不同。我认为OP在计算哭泣表情的中值时出错了。除非有人能发现,否则我得调查一下。有点奇怪@丹麦输出是奇怪的,为什么它是一个稍微不同的数字。正如你所看到的,我清楚地按照中位数进行分组。这不是我创建的自定义函数。这是一个熊猫函数。在@Ch3steR的答案中,差异是中位数与np.nanmedian,所以这就是差异的原因。让我的答案保持原样,在答案中加上注释,这样人们就可以看到中位数和np.nanmedian之间的差异。@DavidErickson这里你已经计算了中位数,包括所有的零。不确定为什么这被否决了:这应该可以解决问题。这给出了错误的输出,对吗?你得到的中位数是17.5和80.0,但不确定为什么输出不同。我认为OP在计算哭泣表情的中值时出错了。除非有人能发现,否则我得调查一下。有点奇怪@丹麦输出是奇怪的,为什么它是一个稍微不同的数字。正如你所看到的,我清楚地按照中位数进行分组。这不是我创建的自定义函数。这是一个熊猫函数。在@Ch3steR的答案中,差异是中位数与np.nanmedian,所以这就是差异的原因。让我的答案保持原样,在答案中加上注释,这样人们就可以看到中间值和np.nanmedian之间的差异。@DavidErickson这里你计算了中间值,包括所有的零。