gpt4 book ai didi

python - 多索引数据框 pandas 中的操作

转载 作者:太空宇宙 更新时间:2023-11-04 05:21:56 25 4
gpt4 key购买 nike

我需要处理来自大数据 csv 的地理和统计数据。它包含来自地理行政和地统计的数据。直辖市、位置、地统计基本分区和区 block 构成层次索引。

我必须为地理索引中数据的最大值的每个元素创建一个新列 ['data2'],并将每个 block 值除以该值。对于每一个指标层级,指标层级的值必须不为0,因为0个指标层级的值说明了其他类型的信息在计算中没有用到。

                       data1  data2
mun loc geo block
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 2 1 1 10 10/12
1 2 1 2 12 12/12
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

有什么想法吗?我已经尝试使用 for 循环,使用 reset_index() 转换列中的索引并按列和行值进行迭代,但计算会一直持续下去,我认为这不是执行此类操作的正确方法。

另外,如果我想得到这样的面具怎么办,这样我就可以对每个级别进行计算。

mun  loc  geo  block
1 0 0 0 False
1 1 0 0 False
1 1 1 0 True
1 1 1 1 False
1 1 1 2 False
1 1 2 0 True
1 1 2 1 False
1 1 2 2 False

mun loc geo block
1 0 0 0 False
1 1 0 0 True
1 1 1 0 False
1 1 1 1 False
1 1 1 2 False
1 2 0 0 True
1 2 2 0 False
1 2 2 1 False

mun loc geo block
1 0 0 0 True
1 1 0 0 False
1 1 1 0 False
1 1 1 1 False
1 1 1 2 False
2 0 0 0 True
2 1 1 0 False
2 1 2 1 False

最佳答案

您可以先从 MultiIndex 创建掩码 , 与 0 比较并通过 any 检查至少一个 True(至少一个 0) :

mask = (pd.DataFrame(df.index.values.tolist(), index=df.index) == 0).any(axis=1)
print (mask)
mun loc geo block
1 0 0 0 True
1 0 0 True
1 0 True
1 False
2 False
2 0 True
1 False
2 False
2 1 1 False
2 False
2 1 1 1 False
2 False
2 1 False
2 False
dtype: bool

然后得到maxgroupby每个第一、第二和第三个索引,但在按 boolean indexing 过滤之前只有在 mask 中不是 True 的值:

df1 = df.ix[~mask, 'data1'].groupby(level=['mun','loc','geo']).max()
print (df1)
mun loc geo
1 1 1 4
2 3
2 1 12
2 1 1 123
2 6

然后 reindex df1 by df.index,移除 Multiindex 的最后一层 reset_index , mask mask 没有变化的值(也有必要删除最后一层)和 fillna1,因为除法返回相同的值。

df1 = df1.reindex(df.reset_index(level=3, drop=True).index)
.mask(mask.reset_index(level=3, drop=True)).fillna(1)
print (df1)
Name: data1, dtype: int64
mun loc geo
1 0 0 1.0
1 0 1.0
1 1.0
1 4.0
1 4.0
2 1.0
2 3.0
2 3.0
2 1 12.0
1 12.0
2 1 1 123.0
1 123.0
2 6.0
2 6.0
Name: data1, dtype: float64

最后除以 div :

print (df['data1'].div(df1.values,axis=0))
mun loc geo block
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
2 1 1 0.833333
2 1.000000
2 1 1 1 1.000000
2 0.056911
2 1 1.000000
2 0.166667
dtype: float64

关于python - 多索引数据框 pandas 中的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40012740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com