首页 > 解决方案 > 当数据框既是 int 又是字符串时,在 Dataframe 中查找行?

问题描述

小问题让我头疼。我有一个类似于以下的数据框:

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 作为 int 。其他人也同样相反。因此,数据框仅将索引中的纯数字与整数匹配,而将其他任何与字符串匹配。

另外,我不能不搜索后缀,因为我有多行具有不同的后缀,例如 34567890-S、34567890-L、34567890-X。

标签: pythonstringpandasdataframeindexing

解决方案


如果要将所有条目转换为一种特定类型,可以使用pandas.Series.astype

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)

在此处输入图像描述


推荐阅读