在 Pandas 数据框中查找第一个匹配项

Jas*_*n S 3 python dataframe pandas

我需要在不属于索引的列上使用 DataFrame 作为查找表。例如(这是一个简单的只是为了说明):

import pandas as pd

westcoast = pd.DataFrame([['Washington','Olympia'],['Oregon','Salem'],
                          ['California','Sacramento']],
                        columns=['state','capital'])
print westcoast

        state     capital
0  Washington     Olympia
1      Oregon       Salem
2  California  Sacramento
Run Code Online (Sandbox Code Playgroud)

查找并获得系列作为输出很容易:

westcoast[westcoast.state=='Oregon'].capital

1    Salem
Name: capital, dtype: object
Run Code Online (Sandbox Code Playgroud)

但我想获得字符串“Salem”:

westcoast[westcoast.state=='Oregon'].capital.values[0]

'Salem'
Run Code Online (Sandbox Code Playgroud)

而且.values[0]看起来有点笨重......有没有更好的方法?

(FWIW:我的真实数据最多可能有 50 行,但是有很多列,所以如果我设置了一个索引列,无论我选择什么列,都会有这样一个不基于索引的查找操作,并且相对较少的行数意味着我不在乎它是否是 O(n) 查找。)

jez*_*ael 5

是的,Series.item如果查找将始终从以下元素返回一个元素,您可以使用Series

westcoast.loc[westcoast.state=='Oregon', 'capital'].item()
Run Code Online (Sandbox Code Playgroud)

如果查找不返回任何内容,或者一个或多个值并且您只需要第一项,则可以处理异常:

s = westcoast.loc[westcoast.state=='Oregon', 'capital']
s = np.nan if s.empty else s.iat[0] 
print (s) #Salem

s = westcoast.loc[westcoast.state=='New York', 'capital']
s = np.nan if s.empty else s.iat[0] 
print (s)
nan
Run Code Online (Sandbox Code Playgroud)

处理异常的更通用的解决方案,因为有 3 种可能的输出场景:

westcoast = pd.DataFrame([['Washington','Olympia'],['Oregon','Salem'],
                          ['California','Sacramento'],['Oregon','Portland']],
                        columns=['state','capital'])

print (westcoast)
        state     capital
0  Washington     Olympia
1      Oregon       Salem
2  California  Sacramento
3      Oregon    Portland

s = westcoast.loc[westcoast.state=='Oregon', 'capital']

#if not value returned
if s.empty:
    s = 'no match'

#if only one value returned
elif len(s) == 1:
    s = s.item()
else:

# if multiple values returned, return a list of values
    s = s.tolist()

print (s)
['Salem', 'Portland']
Run Code Online (Sandbox Code Playgroud)

可以创建一个查找函数:

def look_up(a):
    s = westcoast.loc[westcoast.state==a, 'capital']
    #for no match
    if s.empty:
        return np.nan
    #for match only one value
    elif len(s) == 1:
        return s.item()
    else:
    #for return multiple values
        return s.tolist()

print (look_up('Oregon'))
['Salem', 'Portland']

print (look_up('California'))
Sacramento

print (look_up('New Yourk'))
nan
Run Code Online (Sandbox Code Playgroud)

  • 嗯....返回一个中间系列只是为了得到一个项目似乎很糟糕(在索引中重复的情况下)。没有更好的办法吗? (2认同)