多索引数据帧pandas中的操作

2024-09-28 04:21:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要处理来自大数据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()转换列中的索引,并按列和行值迭代,但计算要花很多时间,我认为这不是执行此类操作的正确方法。在

还有,如果我想得到这样的面具,这样我就可以在每个层面上运行计算了。在

^{pr2}$

Tags: csv数据信息元素类型地理位置区块级别
1条回答
网友
1楼 · 发布于 2024-09-28 04:21:31

您可以首先从^{}创建{},与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

然后根据第一个、第二个和第三个索引按^{}获得^{}值,但在按^{}过滤之前,仅在mask中没有{}的值:

^{pr2}$

然后^{}df1df.index删除{}的最后一级,按^{}删除{}的最后一级,^{}值不受mask(也有必要删除最后一级)和{a9}除以{},因为除以返回相同的值。在

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

最后除以^{}

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

相关问题 更多 >

    热门问题