【问题标题】:Operations in multi index dataframe pandas多索引数据框 pandas 中的操作
【发布时间】:2016-10-13 05:10:39
【问题描述】:

我需要处理来自大数据 csv 的地理和统计数据。它包含来自地理行政和地理统计的数据。直辖市、区位、地统计基本区划、街区构成层次指标。

我必须为每个元素创建一个新列 ['data2'],即地理索引中数据的最大值,然后将每个块值除以该值。对于每个索引级别,索引级别值必须不为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   

【问题讨论】:

  • 所以你需要删除数据框的前 4 行,因为在分层索引中是 0 ?在df2 的第一行是 (0 / max(0,0,7.15,9.85)) ?在第二个(0 / ???)?您可以在输出中添加第二行和第三行的数字吗?谢谢。我觉得有点不清楚。
  • 为清晰起见进行了编辑。我不需要删除那些行,我只是不需要对它们运行操作,而且,0 不仅出现在顶部,而且也出现在每个索引值的末尾,所以你有所有的块geo,以及 loc 的所有 geos,以及市镇的所有 loc。 0 索引指的是按索引计算的总数。我需要对每个 mun 的每个 loc 的每个 geo 的所有块运行 max 运算符,然后将该块的 data1 值除以最大值,尊重层次顺序。
  • 感谢您的编辑。但我认为更好的是valuevalue.. 提供示例数据,例如1,2,3,4,5 然后带有数字的公式是 (1 / 4) 用于第一行,然后是 (2 / 2) ?为了清楚起见,您可以用数字和一些行(如有必要)扩展样本吗?谢谢。
  • 感谢您的帮助。更多的编辑已经完成。放一些值为 0 的索引示例。此外,数据框包含 80 000 + 行分层组合。每个索引都有更多元素,但我只是出于示例目的放了一些。

标签: python pandas


【解决方案1】:

您可以先从MultiIndex 创建mask,与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

然后通过groupby 每个第一、第二和第三索引获取max 值,但在通过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,通过reset_index 删除Multiindex 的最后一级,mask mask 没有更改的值(也必须删除最后一级)和fillna通过1,因为除法返回相同的值。

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

【讨论】:

  • 使用MultiIndex并不容易,我希望它很好用。
  • 非常有用,非常感谢。我只需要一个答案。如果我想创建一个掩码怎么办: mun loc geo block 1 0 0 0 True1 0 0 True 1 0 True 1 False 2 False
  • 对不起,我把评论搞砸了。如果我想要一个面具怎么办: 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
  • 我不确定我是否理解你。如果需要boolean indexing,您需要屏蔽与 Dataframe 具有相同大小并具有相同索引的内容。你能解释更多吗?
  • @marco - 你能编辑问题吗?在评论中格式化是有问题的;)
猜你喜欢
  • 2020-10-22
  • 2020-08-04
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-04
相关资源
最近更新 更多