python - Groupby Diff - 熊猫
问题描述
我想找出多索引中的列之间的区别,我有三个维度,家庭、日期和客户,目标是在 Multi 中拥有与客户、日期和家庭不同的行的新列-指数。
import pandas as pd
import numpy as np
data = {
'Family':{
0: 'Hugo',
1: 'Hugo',
2: 'Hugo',
3: 'Hugo'},
'Date': {
0: '2021-04-15',
1: '2021-04-16',
2: '2021-04-15',
3: '2021-04-16'},
'Client': {
0: 1,
1: 1,
2: 2,
3: 2},
'Code_Client': {
0: 605478.0,
1: 605478.0,
2: 605478.0,
3: 605478.0},
'Price': {
0: 2.23354416539888,
1: 2.0872536032616744,
2: 1.8426286431701764,
3: 0.3225935619590472}
}
df = pd.DataFrame(data)
pd.pivot_table(pd.DataFrame(data), values='Price', index=['Code_Client'],columns=
['Family','Date', 'Client'])
你有什么主意吗?
谢谢,
解决方案
我假设您正在寻找按Family
andDate
和分组的 Price 的差异Client
。您对问题的表述有些不清楚,并且您没有发布预期的输出。我稍微更改了您的数据框以添加一个系列以使解决方案更加明显。
data = {
'Family':{
0: 'Hugo',
1: 'Hugo',
2: 'Victor',
3: 'Victor'},
'Date': {
0: '2021-04-15',
1: '2021-04-16',
2: '2021-04-15',
3: '2021-04-16'},
'Client': {
0: 1,
1: 1,
2: 2,
3: 2},
'Code_Client': {
0: 605478.0,
1: 605478.0,
2: 605478.0,
3: 605478.0},
'Price': {
0: 2.23354416539888,
1: 2.0872536032616744,
2: 1.8426286431701764,
3: 0.3225935619590472}
}
df = pd.DataFrame(data)
pd.pivot_table(pd.DataFrame(data), values='Price', index=['Code_Client'],columns=
['Family','Date', 'Client'])
如您所见,我添加了 Victor 家族。因此,您的数据框如下所示:
Family Date Client Code_Client Price
0 Hugo 2021-04-15 1 605478.0 2.233544
1 Hugo 2021-04-16 1 605478.0 2.087254
2 Victor 2021-04-15 2 605478.0 1.842629
3 Victor 2021-04-16 2 605478.0 0.322594
要按组添加差异列,我建议您执行以下操作:
df = df.set_index(['Family', 'Date','Client']).sort_index()[['Price']]
df['diff'] = np.nan
idx = pd.IndexSlice
for ix in df.index.levels[0]:
df.loc[ idx[ix,:], 'diff'] = df.loc[idx[ix,:], 'Price' ].diff()
第一步索引您的变量(您要分组的变量)并创建一个空(或填充nan
)差异列。第二步通过行之间的差异,按组填充它。
这将返回:
Price diff
Family Date Client
Hugo 2021-04-15 1 2.233544 NaN
2021-04-16 1 2.087254 -0.146291
Victor 2021-04-15 2 1.842629 NaN
2021-04-16 2 0.322594 -1.520035
如果您对 不满意nan
,请执行以下操作:
df = df.set_index(['Family', 'Date','Client']).sort_index()[['Price']]
df['diff'] = np.nan
idx = pd.IndexSlice
for ix in df.index.levels[0]:
df.loc[ idx[ix,:], 'diff'] = df.loc[idx[ix,:], 'Price' ].diff().fillna(0)
我添加.fillna(0)
到diff()
声明中。它返回:
Price diff
Family Date Client
Hugo 2021-04-15 1 2.233544 0.000000
2021-04-16 1 2.087254 -0.146291
Victor 2021-04-15 2 1.842629 0.000000
2021-04-16 2 0.322594 -1.520035
推荐阅读
- javascript - 为什么这段代码无法修改 MongoDB 用户?
- python - Python:Elasticsearch 中的通配符查询
- mysql - 从单列中选择数据作为多条记录
- c++ - 我的 VSCode 调试器不显示任何变量值(附图片)(c++)
- typescript - 为什么打字稿函数重载会添加未定义的类型?
- php - "code": 403, "message": "Forbidden" 在 youtube api 文档中从 YouTube Analytics API 请求数据时
- python - 如何使用数据提供程序在 python 中读取 excel 文件
- firebase - 我可以在 ReactNative 项目中同时使用 'react-native-firebase' 和 'firebase' 吗?
- python-3.x - 是否可以使用 Python(PyUSB)获取 USB 设备节点(文件)?
- javascript - Javascript错误的计算和舍入数字