在multindex上使用loc或iloc选择的熊猫总和和总计

时间:2018-09-27 17:25:19

标签: python pandas pandas-groupby

我正在尝试通过使用熊猫iloc或loc和下面引用的数据集来更新此表1(I,II和III级)。如果有建议,我愿意采用比loc和iloc更好的方法。

表1

enter image description here

示例1

如果我希望该表更新有关薪级13和级别III的1102选项的新信息,我将使用以下pd.loc代码:

jobseries = '1102'
result = df.loc[('3',jobseries),'13']
print (result)
14.0

示例2: 。这也可行。

jobseries = '1102'
result = df.loc[('3',jobseries),'13'].sum()
print (result)
14

但是,挑战是当我需要选择多个索引或多个列时。

多行

现在,如果我要更新所有级别I的表1,总计,而不是执行某种类型的df.isin,则需要o执行以下操作:

示例3:

total = df.loc[('1',jobseries),'07'] + df.loc[('1',jobseries),'09'] + and so on...
print (total)
32

这有效,但我相信最终会抛出RuntimeWarning:在long_scalars中遇到无效值。因此,这不是最好的方法。有什么建议吗?

多个列

现在,如果我要更新表1,则为I级,II级和III级以及任何给定的年级证书#,我无法弄清楚代码。我已经尝试了以下方法,但是抛出了keyError。我已经尝试了多种方法来完成此操作,但仍然无法解决:

示例4:

jobseries = '1102'
result = df.loc[('1','2','3',jobseries),'All']
print (result)
KeyError: "None of [[('1', '2', '3', '1102')]] are in the [index]"

这很奇怪,因为如果我检查索引,keyError会让我感到困惑。

df.index:

MultiIndex(levels=[['1', '2', '3', 'All'], ['', '0301', '0341', '0342', '0343', '0501', '0560', '0810', '0850', '1101', '1102', '1105', '1106', '1109', '1145', '1146', '1170', '1410']],
           labels=[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3], [2, 3, 4, 6, 7, 9, 10, 11, 12, 13, 16, 17, 2, 8, 9, 10, 11, 1, 3, 4, 5, 9, 10, 11, 14, 15, 16, 0]],
           names=['Level', 'JobSeries'])

我也尝试过df.xs:

示例5:

jobseries = '1102'
result = df.xs(jobseries, level=1)
print (result)

        01   07   08   09   11    12    13   14   15  All
Level                                                    
1      1.0  0.0  0.0  9.0  8.0   9.0   6.0  0.0  0.0   15
2      0.0  0.0  0.0  4.0  6.0  12.0   6.0  1.0  0.0   13
3      1.0  0.0  0.0  0.0  1.0  11.0  14.0  9.0  3.0   14

行或列的更改

另一个挑战是,如果数据集发生更改并且索引或行发生更改,则pd.loc和pd.iloc将引发关键错误。反正还有吗?

df:

                 01   07   08    09    11    12    13   14   15  All
Level JobSeries                                                      
1     0341       0.0  0.0  0.0   0.0   0.0   1.0   0.0  0.0  0.0    1
      0342       0.0  0.0  1.0   0.0   0.0   0.0   0.0  0.0  0.0    1
      0343       0.0  0.0  0.0   0.0   0.0   2.0   0.0  0.0  0.0    2
      0560       0.0  0.0  0.0   1.0   0.0   0.0   0.0  0.0  0.0    1
      0810       0.0  0.0  0.0   0.0   1.0   0.0   0.0  0.0  0.0    1
      1101       0.0  0.0  0.0   0.0   0.0   1.0   0.0  0.0  0.0    1
      1102       1.0  0.0  0.0   9.0   8.0   9.0   6.0  0.0  0.0   15
      1105       0.0  7.0  3.0   5.0   0.0   0.0   0.0  0.0  0.0    9
      1106       0.0  2.0  0.0   0.0   0.0   0.0   0.0  0.0  0.0    2
      1109       0.0  0.0  0.0   0.0   2.0   0.0   0.0  0.0  0.0    2
      1170       0.0  0.0  0.0   0.0   1.0   2.0   0.0  0.0  0.0    3
      1410       0.0  0.0  0.0   0.0   0.0   0.0   1.0  0.0  0.0    1
2     0341       0.0  0.0  0.0   0.0   0.0   0.0   1.0  0.0  0.0    1
      0850       0.0  0.0  0.0   0.0   0.0   0.0   1.0  0.0  0.0    1
      1101       0.0  0.0  0.0   0.0   0.0   0.0   1.0  1.0  0.0    2
      1102       0.0  0.0  0.0   4.0   6.0  12.0   6.0  1.0  0.0   13
      1105       0.0  0.0  1.0   0.0   0.0   0.0   0.0  0.0  0.0    1
3     0301       0.0  0.0  0.0   0.0   0.0   0.0   0.0  0.0  1.0    1
      0342       0.0  0.0  0.0   0.0   0.0   0.0   0.0  0.0  1.0    1
      0343       0.0  0.0  0.0   0.0   0.0   0.0   0.0  0.0  1.0    1
      0501       0.0  0.0  0.0   0.0   0.0   0.0   1.0  0.0  0.0    1
      1101       0.0  0.0  0.0   0.0   0.0   0.0   2.0  1.0  0.0    2
      1102       1.0  0.0  0.0   0.0   1.0  11.0  14.0  9.0  3.0   14
      1105       0.0  1.0  0.0   0.0   0.0   0.0   0.0  0.0  0.0    1
      1145       0.0  0.0  0.0   0.0   0.0   0.0   1.0  0.0  0.0    1
      1146       0.0  0.0  0.0   0.0   0.0   0.0   0.0  1.0  0.0    1
      1170       0.0  0.0  0.0   0.0   0.0   1.0   1.0  0.0  0.0    2
All              2.0  8.0  4.0  11.0  11.0  14.0  15.0  9.0  4.0   17

参考:

pd.loc:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.loc.html

pd.xs:https://pandas.pydata.org/pandas-docs/version/0.22/generated/pandas.DataFrame.xs.html

pd.iloc:https://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-integer

1 个答案:

答案 0 :(得分:0)

我不清楚要问,但会

df.groupby(df.index).count()[13]df.groupby(df.index).sum()[13]用于一列,或

df.groupby(['Level','JobSeries']).sum().loc[1,341]连续

完成您要找的东西吗? level中的groupby参数旨在处理多索引问题