寻找merg的倒数

2024-10-02 16:28:00 发布

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

我有两个pandas数据帧,一个是州、城市和首都标志的列表,多索引为(州、城市),另一个是州及其首都的非索引(或默认索引,如果更合适的话)列表,我需要对这两个元素执行一个内部连接,然后还要找出城市数据框中的哪些项不在连接中。你知道吗

城市:

                  capital
state    city
Ohio     Akron          N
         Toledo         N
         Columbus       N
Colorado Boulder        N
         Denver         N

国家:

           state        city
0  West Virginia  Charleston
1           Ohio    Columbus

寻找俄亥俄州首府:

pd.merge(cities, states, on=['state', 'city'], how='inner')
  state      city capital
0  Ohio  Columbus       N

现在我需要得到一个数据框,它包括除了俄亥俄州哥伦布以外的所有城市的数据框。我一直在研究.isin()的变体,包括有reset_index()和没有reset_index(),但我无法让它工作。你知道吗

创建城市和州的代码。我将set_index()作为一个单独的调用,因为如果我在创建df时尝试这样做,我会得到一个关于ValueError: Shape of passed values is (3, 3), indices imply (2, 3)的错误,并且还没有找到解决方法。你知道吗

cities = pd.DataFrame({'state':['Ohio', 'Ohio', 'Ohio', 'Colorado', 'Colorado'], 'city':['Akron', 'Toledo', 'Columbus', 'Boulder', 'Denver'], 'capital':['N', 'N', 'N', 'N', 'N']}, columns=['state', 'city', 'capital'])
cities.set_index(('state', 'city'))
states = pd.DataFrame({'state':['West Virginia', 'Ohio'], 'city':['Charleston', 'Columbus']})

Tags: 数据city列表indexpdstatecitiescapital
1条回答
网友
1楼 · 发布于 2024-10-02 16:28:00

IIUC,您可以将mergehow='outer'indicator='source'一起使用,并且只保留那些'left_only'

merge = cities.merge(states, on=['state', 'city'], how='outer', indicator='source')
result = merge[merge.source.eq('left_only')].drop('source', axis=1)
print(result)

输出

      state     city capital
0      Ohio    Akron       N
1      Ohio   Toledo       N
3  Colorado  Boulder       N
4  Colorado   Denver       N

另一种方法是使用isin,方法如下:

mask = ~cities.reset_index().city.isin(states.city)
print(cities[pd.Series(data=mask.values, index=cities.index)])

输出

                 capital
state    city           
Ohio     Akron         N
         Toledo        N
Colorado Boulder       N
         Denver        N

第二种方法的思想是创建一个布尔掩码,其索引与cities中的索引匹配。第二种方法的变化如下:

# drop the index
re_indexed = cities.reset_index()

# find the mask
mask = ~re_indexed.city.isin(states.city)

# reindex back
result = re_indexed[mask].set_index(['state', 'city'])

print(result)

相关问题 更多 >