从dataframe中选择行,该dataframe基于其他dataframe列具有多个索引

2024-10-01 04:58:35 发布

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

我有一个“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']))]

但是结果行比我预期的要多。还有其他更精确的方法吗


Tags: 数据名称getindexnanlevel地区state
1条回答
网友
1楼 · 发布于 2024-10-01 04:58:35

最简单的方法是合并交叉点的两个数据帧

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_onright_on参数而不是left_indexright_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对你的情况有用。让我知道进展如何

相关问题 更多 >