gpt4 book ai didi

python - 使用逻辑 pandas 进行多重索引和掩码

转载 作者:行者123 更新时间:2023-12-01 03:38:27 26 4
gpt4 key购买 nike

我有 4 个索引。 Mun、loc、geo 和 block。我需要创建 mask 来对它们进行操作,这样我就可以创建 mask 并执行如下所示的操作:

                       data1  data2
mun loc geo block
0 0 0 0 12 12
1 0 0 0 20 20
1 1 0 0 10 10
1 1 1 0 10 10
1 1 1 1 3 3/4
1 1 1 2 4 4/4
1 1 2 0 30 30
1 1 2 1 1 1/3
1 1 2 2 3 3/3
1 1 0 0 4 4
1 2 1 1 10 10/12
1 2 1 2 12 12/12
2 0 0 0 60 60
2 1 1 1 123 123/123
2 1 1 2 7 7/123
2 1 2 1 6 6/6
2 1 2 2 1 1/6
                       data1  data2
mun loc geo block
0 0 0 0 12 12
1 0 0 0 20 20
1 1 0 0 10 10
1 1 1 0 10 10/30
1 1 1 1 4 4
1 1 2 0 30 30/30
1 2 1 0 2 2/3
1 2 2 0 3 3/3
1 2 3 0 1 1/3
2 0 0 0 60 60
2 1 1 0 12 12/88
2 1 1 1 1 1
2 1 2 0 88 88/88
2 1 2 1 9 9
                       data1  data2
mun loc geo block
0 0 0 0 14 14
1 0 0 0 12 12
1 1 0 0 20 20/20
1 1 1 0 10 10
1 1 1 1 31 31
1 2 0 0 15 15/20
1 2 1 1 11 11
2 0 0 0 80 80
2 1 0 0 100 100/100
2 1 1 2 7 7
2 2 0 0 11 11/100

data1 data2
mun loc geo block
0 0 0 0 55 55
1 0 0 0 70 70/70
1 1 0 0 12 12
1 1 1 0 13 13
2 0 0 0 60 60/70
2 1 1 1 12 12
2 1 2 1 6 6
3 0 0 0 12 12/70

也就是说,取层次结构内的最大值并将每个元素除以它。我在 another question 获得了帮助关于第一个问题,但我在掌握多索引时遇到了很多问题。任何帮助我将不胜感激。

最佳答案

这并不容易。但主要用get_level_values对于选择条件值:

级别 block :

print (df)
data1 data2
mun loc geo block
0 0 0 0 12 12
1 0 0 0 20 20
1 0 0 10 10
1 0 10 10
1 3 3/4
2 4 4/4
2 0 30 30
1 1 1/3
2 3 3/3
0 0 4 4
2 1 1 10 10/12
2 12 12/12
2 0 0 0 60 60
1 1 1 123 123/123
2 7 7/123
2 1 6 6/6
2 1 1/6

mask3 = (df.index.get_level_values('mun') != 0) & \
(df.index.get_level_values('loc') != 0 ) & \
(df.index.get_level_values('geo') != 0) & \
(df.index.get_level_values('block') != 0 )

print (mask3)
[False False False False True True False True True False True True
False True True True True]

df2 = df.ix[mask3, 'data1'].groupby(level=['mun','loc','geo']).max()
#print (df2)

df2 = df2.reindex(df.reset_index(level=3, drop=True).index).mask(~mask3).fillna(1)
#print (df2)
print (df['data1'].div(df2.values,axis=0))
mun loc geo block
0 0 0 0 12.000000
1 0 0 0 20.000000
1 0 0 10.000000
1 0 10.000000
1 0.750000
2 1.000000
2 0 30.000000
1 0.333333
2 1.000000
0 0 4.000000
2 1 1 0.833333
2 1.000000
2 0 0 0 60.000000
1 1 1 1.000000
2 0.056911
2 1 1.000000
2 0.166667
dtype: float64
<小时/>

级别地理位置:

print (df)
data1 data2
mun loc geo block
0 0 0 0 12 12
1 0 0 0 20 20
1 0 0 10 10
1 0 10 10/30
1 4 4
2 0 30 30/30
2 1 0 2 2/3
2 0 3 3/3
3 0 1 1/3
2 0 0 0 60 60
1 1 0 12 12/88
1 1 1
2 0 88 88/88
1 9 9

df1 = df.reset_index(drop=True, level='block')

mask3 = (df.index.get_level_values('mun') != 0) & \
(df.index.get_level_values('loc') != 0 ) & \
(df.index.get_level_values('geo') != 0) & \
(df.index.get_level_values('block') == 0 )

print (mask3)
[False False False True False True True True True False True False
True False]

df2 = df1.ix[mask3, 'data1'].groupby(level=['mun','loc']).max()

df2=df2.reindex(df.reset_index(level=['geo','block'], drop=True).index).mask(~mask3).fillna(1)
print (df2)
df['new'] = df['data1'].div(df2.values,axis=0)
print (df)
data1 data2 new
mun loc geo block
0 0 0 0 12 12 12.000000
1 0 0 0 20 20 20.000000
1 0 0 10 10 10.000000
1 0 10 10/30 0.333333
1 4 4 4.000000
2 0 30 30/30 1.000000
2 1 0 2 2/3 0.666667
2 0 3 3/3 1.000000
3 0 1 1/3 0.333333
2 0 0 0 60 60 60.000000
1 1 0 12 12/88 0.136364
1 1 1 1.000000
2 0 88 88/88 1.000000
1 9 9 9.000000
<小时/>

级别loc:

print (df)
data1 data2
mun loc geo block
0 0 0 0 14 14
1 0 0 0 12 12
1 0 0 20 20/20
1 0 10 10
1 31 31
2 0 0 15 15/20
1 1 11 11
2 0 0 0 80 80
1 0 0 100 100/100
1 2 7 7
2 0 0 11 11/100

df1 = df.reset_index(drop=True, level=['block', 'geo'])


mask3 = (df.index.get_level_values('mun') != 0) & \
(df.index.get_level_values('loc') != 0 ) & \
(df.index.get_level_values('geo') == 0) & \
(df.index.get_level_values('block') == 0 )

print (mask3)
[False False True False False True False False True False True]

df2 = df1.ix[mask3, 'data1'].groupby(level=['mun']).max()
#print (df2)

df2 =df2.reindex(df.reset_index(level=['geo','block', 'loc'], drop=True).index).mask(~mask3).fillna(1)
#print (df2)
print (df['data1'].div(df2.values,axis=0))
mun loc geo block
0 0 0 0 14.00
1 0 0 0 12.00
1 0 0 1.00
1 0 10.00
1 31.00
2 0 0 0.75
1 1 11.00
2 0 0 0 80.00
1 0 0 1.00
1 2 7.00
2 0 0 0.11
dtype: float64
<小时/>

级别mun:

print (df)
data1 data2
mun loc geo block
0 0 0 0 55 55
1 0 0 0 70 70/70
1 0 0 12 12
1 0 13 13
2 0 0 0 60 60/70
1 1 1 12 12
2 1 6 6
3 0 0 0 12 12/70

mask3 = (df.index.get_level_values('mun') != 0) & \
(df.index.get_level_values('loc') == 0 ) & \
(df.index.get_level_values('geo') == 0) & \
(df.index.get_level_values('block') == 0 )

print (mask3)
[False True False False True False False True]

df2 = df.ix[mask3, 'data1'].max()
#print (df2)

df2 = pd.Series(df2, index=df.index).mask(~mask3).fillna(1)
#print (df2)
print (df['data1'].div(df2.values,axis=0))
mun loc geo block
0 0 0 0 55.000000
1 0 0 0 1.000000
1 0 0 12.000000
1 0 13.000000
2 0 0 0 0.857143
1 1 1 12.000000
2 1 6.000000
3 0 0 0 0.171429
dtype: float64

关于python - 使用逻辑 pandas 进行多重索引和掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40036532/

26 4 0
文章推荐: python - django - 当指定字段更改时如何自定义模型保存方法
文章推荐: file - 如何在 Yii2 框架中验证现有文件
文章推荐: perl - 如何最好地解析/拆分基于
标签的
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com