遇到小问题。我有一个类似于以下内容的数据框:
Number Title
12345678 A
34567890-S B
11111111 C
22222222-L D
这是使用python中的pandas从excel文件中读取的,然后将索引设置为第一列:
db = db.set_index(['Number'])
然后我根据编号查找标题:
lookup = "12345678"
title = str(db.loc[lookup, 'Title'])
但是...虽然后缀为“ -Something”的任何东西都可以工作,但是没有它的任何东西都找不到位置(例如12345678将找不到任何位置,而34567890-S将会找到任何位置)。我唯一的预感是与查找字符串或整数有关,但是我已经尝试了一些方法(将表转换为所有字符串,将loc更改为iloc,ix等),但到目前为止还没有运气。
有什么想法吗?谢谢:)
更新:因此,从头开始尝试不会表现出相同的行为(创建测试数据库可能只是将所有内容设置为字符串),但是从CSV导入会导致上述结果。
找不到“ 12345678”(作为字符串),而是将12345678作为整数。同样对于其他人则相反。因此,数据框仅将索引中的纯数字与整数匹配,而将其他任何字符串与字符串匹配。
此外,我不能不搜索后缀,因为我有多行具有不同后缀的行,例如34567890-S,34576890-L,34576890-X。
答案 0 :(得分:4)
db["Number"] = df["Number"].astype(str)
db = db.set_index(['Number'])
lookup = "12345678"
title = db.loc[lookup, 'Title']
有趣的是,这实际上比使用pandas.Index.map
要慢:
x1 = [pd.Series(np.arange(n)) for n in np.logspace(1, 4, dtype=int)]
x2 = [pd.Index(np.arange(n)) for n in np.logspace(1, 4, dtype=int)]
def series_astype(x1):
return x1.astype(str)
def index_map(x2):
return x2.map(str)
{{3}}
答案 1 :(得分:0)
将所有索引定义为字符串,因为至少其中一些不是数字。如果要查找可能带有后缀的特定项目,则可以通过将字符串的开头与$
进行比较来进行匹配:
.str.startswith