我想找出列在多索引之间的差异,我有三个维度,家庭,日期和客户,在目标是有新的列与客户的行,日期和多索引中的家庭的差异。
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'])

你有什么想法吗?
谢谢,
发布于 2021-04-22 17:24:37
我假设您正在寻找按Family、Date和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'])如你所见,我加入了维克多家族。所以,你的数据帧看起来是这样的:
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)我在diff()语句中添加了.fillna(0)。它返回:
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
https://stackoverflow.com/questions/67201250
复制相似问题