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) 查找。)
是的,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)