当前位置: 首页 > 面试题库 >

使用相同的列,不同的索引级别对DataFrame进行算术和对齐

申屠宏胜
2023-03-14
问题内容

我有两个熊猫DataFrames-weightLand Use列上有一个简单的Index 。concentrationLand Use和上具有MultiIndex Parameter

import pandas
from io import StringIO

conc_string = StringIO("""\
Land Use,Parameter,1E,1N,1S,2
Airfield,BOD5 (mg/l),0.418,0.118,0.226,1.063
Airfield,Ortho P (mg/l),0.002,0.001,0.001,0.002
Airfield,TSS (mg/l),1.773,11.47,0.862,0.183
Airfield,Zn (mg/l),0.001,0.001,4.95E-05,0.001
"Commercial",BOD5 (mg/l),0.036,0.0419,,0.315
"Commercial",Cu (mg/l),4.37E-05,7.34E-05,,0.00039
"Commercial",O&G (mg/l),0.0385,0.127,,0.263
Open Space,TSS (mg/l),0.371,3.01,1.209,0.147
Open Space,Zn (mg/l),0.0127,0.0069,0.0132,0.007
"Parking Lot",BOD5 (mg/l),0.924,0.0668,2.603,3.19
"Parking Lot",O&G (mg/l),1.02,0.149,1.347,1.88
"Rooftops",BOD5 (mg/l),0.135,1.00,0.0562,0.310""")

weight_string = StringIO("""\
Land Use,1E,1N,1S,2
Airfield,0.511,0.0227,0.0616,0.394
Commercial,0.0005,0.1704,0,0.1065
Open Space,0.0008,0.005,0.0002,0.0004
"Parking Lot",0.33,0.514,0.252,0.171
Rooftops,0.081,0.028,8.50E-05,0.003""")

concentration = pandas.read_csv(conc_string, index_col=[0,1])
weight = pandas.read_csv(weight_string, index_col=0)

在这种情况下,列(1E,1N,1S和2)是流域盆地。

我想做的是将所有浓度除以Parameter盆地(列名)和的权重Land Use

我在这里运气不好。concentration / weight当然是行不通的。我没有很多运气堆叠数据帧并加入

wstk = pandas.DataFrame(weight.stack())
wstk.index.names = ['Land Use', 'Basin']
wstk.rename(columns={0:'weight'}, inplace=True)

cstk = pandas.DataFrame(concentration.stack())
cstk.index.names = ['Land Use', 'Parameter', 'Basin']
cstk.rename(columns={0:'concentration'}, inplace=True)

wstk.join(cstk, on=['Land Use', 'Basin']) # fails 
cstk.join(wstk, on=['Land Use', 'Basin']) # fails

当我离开onkwarg时,最后两行不会引发错误,但是会返回NaNjoined列的结果。如果我在两个堆叠的DataFrame上都放下索引,它们也会失败(例如,wstk.reset_index(inplace=True)在连接之前执行)。

有什么建议?


问题答案:

使用DataFramediv方法并为您要广播的多索引传递matchkey:

从文档中div

level : int or name
    Broadcast across a level, matching Index values on the
    passed MultiIndex level

In [39]: concentration.div(weight, level='Land Use')
Out[39]:
                                    1E          1N           1S           2
Land Use    Parameter
Airfield    BOD5 (mg/l)       0.818004    5.198238     3.668831    2.697970
            Ortho P (mg/l)    0.003914    0.044053     0.016234    0.005076
            TSS (mg/l)        3.469667  505.286344    13.993506    0.464467
            Zn (mg/l)         0.001957    0.044053     0.000804    0.002538
Commercial  BOD5 (mg/l)      72.000000    0.245892          NaN    2.957746
            Cu (mg/l)         0.087400    0.000431          NaN    0.003662
            O&G (mg/l)       77.000000    0.745305          NaN    2.469484
Open Space  TSS (mg/l)      463.750000  602.000000  6045.000000  367.500000
            Zn (mg/l)        15.875000    1.380000    66.000000   17.500000
Parking Lot BOD5 (mg/l)       2.800000    0.129961    10.329365   18.654971
            O&G (mg/l)        3.090909    0.289883     5.345238   10.994152
Rooftops    BOD5 (mg/l)       1.666667   35.714286   661.176471  103.333333


 类似资料:
  • 在log4j2文档log4j2 java配置中,默认配置为: 根本就不在那里。它仍将只打印出错误日志。 问题 是否有其他人遇到此问题? 有人能复制它吗? 有人知道怎么修吗?我几乎要给别人一块钱。不过,我肯定会把他们的答案标成绿色。 我的最终目标是让特定的记录器发送SMTP请求。我很确定我知道怎么做,我只是在和这个小问题作斗争

  • 现在,首次呈现发生在页面加载时。它只是在javascript文件中调用,如下所示: 这个很好用。 我现在需要的是重写相同的组件,但是使用不同的数据(实际上只是使用不同的数据顺序)。 我在codepen上发布了我的原始代码,以便于调查:https://codepen.io/andriusl/pen/yxwxzg

  • 我的简单问题是:如果我有两个类似logger的语句。info()和记录器。error()在Java中(使用log4j),我希望将这两行的结果打印在两个单独的文件中。也就是说,记录器。信息(…)应该打印到一个文件,比如myLog。信息和记录器。错误(…)应该打印到myLog。错误文件。我正在使用滚动文件追加器执行此任务。另外,我只需要一个记录器对象来完成任务。有人可能会建议两个或多个不同的记录器,每

  • 我知道已经有很多相关的问题了,但是没有一个回答了我的特殊需求。 我想在一个有50列的表上使用dplyr“summary”,我需要对这些列应用不同的摘要函数。 “SUMMARE_all”和“SUMMARY_at”似乎都有缺点,即不可能将不同的函数应用于变量的不同子组。 例如,让我们假设iris数据集有50列,所以我们不想按名称寻址列。我需要前两列的总和、第三列的平均值以及所有剩余列的第一个值(在gr

  • 问题内容: 我尝试过一些关于绑定和未绑定方法的代码。当我们调用它们时,我认为它们都会返回对象。但是,当我用于获取一些信息时,它返回的内容我并不理解。 IDE:Eclipse 插件:pydev 输出是… 为什么#1和#2返回相同的ID?他们不是不同的对象吗?如果我们分配和两个变量,#3,#4回报不同的ID。 我认为#3和#4表明它们不是同一对象,而是#1和#2 … 绑定方法的ID和未绑定方法的ID有