在 Pandas 中,创建一个相对于组内特定类别的变量

Posted

技术标签:

【中文标题】在 Pandas 中,创建一个相对于组内特定类别的变量【英文标题】:In Pandas, create a variable relative to a specific category within the group 【发布时间】:2020-10-02 19:20:47 【问题描述】:

我有一个像这样的数据框

df = pd.DataFrame('week': [1, 1, 1, 2, 2, 2, 3, 3, 3],
                   'p':  list(range(1, 4)) * 3,
                    'q': [4, 2, 1, 6, 2, 1, 6, 3, 2])
df



   week p   q
0   1   1   4
1   1   2   2
2   1   3   1
3   2   1   6
4   2   2   2
5   2   3   1
6   3   1   6
7   3   2   3
8   3   3   2

在此数据框中,p 标识产品(1、2 和 3),q 是一周内售出的数量。我需要使用周内信息创建两个变量。第一个应该具有 q 相对于 p=3 乘积的比率。第二个应该具有相对于产品 2(对于产品 1)和相对于产品 3(对于产品 2)的比率。期望的输出应该是:

   week p   q   d1  d2
0   1   1   4   4.0 2.0
1   1   2   2   2.0 2.0
2   1   3   1   1.0 1.0
3   2   1   6   6.0 3.0
4   2   2   2   2.0 2.0
5   2   3   1   1.0 1.0
6   3   1   6   3.0 2.0
7   3   2   3   1.5 1.5
8   3   3   2   1.0 1.0

This 答案是相关的,它允许我创建第一个变量(我需要将 NaN 替换为产品 p = 3 的变量)。

df['d1']=np.nan
df['d1']=df.loc[df.p!=3,'d1'].\
                fillna(df.q/df.groupby('week').q.transform('last'))
df

   week p   q   d1
0   1   1   4   4.0
1   1   2   2   2.0
2   1   3   1   NaN
3   2   1   6   6.0
4   2   2   2   2.0
5   2   3   1   NaN
6   3   1   6   3.0
7   3   2   3   1.5
8   3   3   2   NaN

还有两件事我无法弄清楚。首先,如果不是定义相对于 p=3 的第一个变量,而是相对于 p=2 定义它,我将如何修改上面的代码? (或者有什么更好的选择?)

第二,如何生成第二个变量? (对于 p=1,q 的值相对于 p=2 的值,对于 p=2 的值相对于 p=3 的值)。

【问题讨论】:

那么对于d1,您想将df.q 除以除产品3 之外的每个产品的上周价值吗? d2 也一样,但不包括 p 2 ? 没有。对于d1,我想将 df.q 除以与产品 3 关联的那个(在这个例子中它是最后一个,但它不需要)。对于d2,我想将产品1的df.q除以产品2,将产品2的df.q除以产品3。 【参考方案1】:

试试这个:

df['d1'] = df.q / df.q.where(df.p.eq(3)).groupby(df.week).transform('first')
df['d2'] = df.q / df.groupby('week').q.shift(-1).fillna(df.q)

Out[74]:
   week  p  q   d1   d2
0     1  1  4  4.0  2.0
1     1  2  2  2.0  2.0
2     1  3  1  1.0  1.0
3     2  1  6  6.0  3.0
4     2  2  2  2.0  2.0
5     2  3  1  1.0  1.0
6     3  1  6  3.0  2.0
7     3  2  3  1.5  1.5
8     3  3  2  1.0  1.0

【讨论】:

我没想到换班,很好的回答^^

以上是关于在 Pandas 中,创建一个相对于组内特定类别的变量的主要内容,如果未能解决你的问题,请参考以下文章

如何管理相对于组的用户权限?

Apache:限制对虚拟主机内特定源 IP 的访问

将不同的功能应用于组对象中的不同项目:Python pandas

Python / Pandas是否可以向量化与相对类别中所有其他点的比较?

获取时间范围内特定日期的数据,时间范围有微小的差异

sql 批量修改,,mysql数据库某表内特定字符后40位后面添加添加特定内容怎样实现。