当数据框为整数或字符串时在数据框中查找行?

时间:2019-04-17 11:30:29

标签: python string pandas dataframe indexing

遇到小问题。我有一个类似于以下内容的数据框:

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。

2 个答案:

答案 0 :(得分:4)

如果要将所有条目转换为一种特定类型,则可以使用enter image description here

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