Pandas: Grouped DataFrame - 将列的值除以每个组该列中某一行的值

Posted

技术标签:

【中文标题】Pandas: Grouped DataFrame - 将列的值除以每个组该列中某一行的值【英文标题】:Pandas: Grouped DataFrame - divide values of a column by the value of a certain row within that column for each group 【发布时间】:2019-08-05 19:05:18 【问题描述】:

我有一个包含组的数据框。 为了标准化每个组的值,我想将每个组的所有值除以该组中某个元素的值。

df = pd.DataFrame([['a','2018-02-03',42],
                   ['a','2018-02-04',22],
                   ['a','2018-02-05',10],
                   ['a','2018-02-06',32],
                   ['b','2018-02-03',10],
                   ['b','2018-02-04',8],
                   ['b','2018-02-05',2],
                   ['b','2018-02-06',12],
                   ['c','2018-02-03',20],
                   ['c','2018-02-04',30],
                   ['c','2018-02-05',5],
                   ['c','2018-02-06',15]])
df.columns = ['product','day','value']

我想通过 'day' == '2018-02-05' 的 'value' 对每个 'product' 的列 'value' 进行规范化

预期结果:

    product     day         value
0   a           2018-02-03  4.2
1   a           2018-02-04  2.2
2   a           2018-02-05  1
3   a           2018-02-06  3.2
5   b           2018-02-03  5
6   b           2018-02-04  4
7   b           2018-02-05  1
8   b           2018-02-06  6
10  c           2018-02-03  4
11  c           2018-02-04  6
12  c           2018-02-05  1
13  c           2018-02-06  3

我试过df.groupby('product').transform()。 访问第一个值.transform('first') 是可能的。 但是我找不到访问某个值的方法。

注释: 也许这个不用.groupby()也能解决?

【问题讨论】:

【参考方案1】:

这样做:

df = pd.DataFrame([['a','2018-02-03',42],
                   ['a','2018-02-04',22],
                   ['a','2018-02-05',10],
                   ['a','2018-02-06',32],
                   ['b','2018-02-03',10],
                   ['b','2018-02-04',8],
                   ['b','2018-02-05',2],
                   ['b','2018-02-06',12],
                   ['c','2018-02-03',20],
                   ['c','2018-02-04',30],
                   ['c','2018-02-05',5],
                   ['c','2018-02-06',15]])
df.columns = ['product','day','value']

date = '2018-02-05'

# Set the index to ['product', 'day']
df.set_index(['product', 'day'], inplace=True)

# Helper Series - Values of date at index 'day'
s = df.xs(date, level=1)

# Divide df by helper Series and reset index
df = df.div(s, level=0).reset_index()
print(df)

   product         day  value
0        a  2018-02-03    4.2
1        a  2018-02-04    2.2
2        a  2018-02-05    1.0
3        a  2018-02-06    3.2
4        b  2018-02-03    5.0
5        b  2018-02-04    4.0
6        b  2018-02-05    1.0
7        b  2018-02-06    6.0
8        c  2018-02-03    4.0
9        c  2018-02-04    6.0
10       c  2018-02-05    1.0
11       c  2018-02-06    3.0

【讨论】:

以上是关于Pandas: Grouped DataFrame - 将列的值除以每个组该列中某一行的值的主要内容,如果未能解决你的问题,请参考以下文章

使用loc时的pandas警告

将百分位数传递给 pandas agg 函数

pandas中没有指定字段名,读取相应字段时的数据类型

R语言使用skimr包的skim函数查看使用dplyr包的groupby函数分组后dataframe的summary信息统计汇总信息(Handle grouped data)

Seaborn:来自两个Dataframes的Grouped Boxplot

Python实现打印量统计