首页 > 解决方案 > 从具有基于其他数据框列的多索引的数据框中选择行

问题描述

我有以州和地区名称为列的“univer”数据框,

    State   RegionName
0   Alabama Auburn
1   Alabama Florence
2   Alabama Jacksonville
3   Alabama Livingston

并且“statobot”数据框具有州和地区名称作为索引,

State   RegionName  2008Q3  2009Q2  ratio       
AK    Anchor Point  NaN NaN NaN
      Anchorage 296166.666667   271933.333333   1.089115
      Fairbanks 249966.666667   225833.333333   1.106863
      Homer NaN NaN NaN
      Juneau    305133.333333   282666.666667   1.079481
      Kenai NaN NaN NaN
      Ketchikan NaN NaN NaN
      Kodiak    NaN NaN NaN
      Lakes 257433.333333   257200.000000   1.000907
      North Pole    241833.333333   219366.666667   1.102416
      Palmer    259466.666667   263800.000000   0.983573

现在我想根据“univer”数据框选择“statobot”数据框中的行,州和地区名称必须完全匹配,我尝试过使用

haveuni = statobot[(statobot.index.get_level_values(0).isin(univer['State'])) &(statobot.index.get_level_values(1).isin(univer['RegionName']))]

但结果行比我预期的要多得多。有没有其他更精确的方法?

标签: pythonpandasdataframe

解决方案


最简单的方法是合并 2 个数据框以进行交集。

statbot = statbot.set_index(['State', 'RegionName'])
univer = univer.set_index(['State', 'RegionName'])

print(pd.merge(univer, statbot, left_index=True, right_index=True, how='inner'))

在这里,我对 2 个数据帧有相同的多索引。left_on如果您没有索引,则可以使用andright_on参数而不是left_indexand指定要合并的列right_index

否则还有其他一些使用df.loc和横截面的方法 -df.xs关于多索引

循环遍历“univer”数据帧并找到与索引匹配的行 - “statbot”数据帧中的“State”和“RegionName”

for i, row in univer.iterrows():
    print(statbot.loc[row['State'], row['RegionName']])

如果您可能想要整行而不删除索引字段,那么

for i, row in univer.iterrows():
    print(statbot.xs((row['State'], row['RegionName']), level=(0, 1), axis=0, drop_level=False))

另一种方法是使用切片

statbot.reset_index(inplace=True)
for i, row in univer.iterrows():
    print(statbot[(statbot['State']==row['State']) & (statbot['RegionName']==row['RegionName'])])

我希望这pd.merge应该适用于您的情况。让我知道事情的后续。


推荐阅读