当数据框既是 int 又是字符串时,在 Dataframe 中查找行?

Posted

技术标签:

【中文标题】当数据框既是 int 又是字符串时,在 Dataframe 中查找行?【英文标题】:Finding row in Dataframe when dataframe is both int or string? 【发布时间】:2019-09-07 15:24:34 【问题描述】:

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

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。

【问题讨论】:

你确定“数字”后面没有空格吗? 如果您没有@vercelli 提到的空格,应该可以工作。 '12345678' 会起作用,但 '12345678' 不会。您可以删除索引df.index=df.index.str.strip() 然后loc[] 【参考方案1】:

如果要将所有条目转换为一种特定类型,可以使用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)

【讨论】:

谢谢,这行得通。这也有效(设置索引后):db.index = db.index.map(str) @pepsi_max2k:添加了pandas.Series.astypepandas.Index.map之间的时间比较。【参考方案2】:

将所有索引视为字符串,因为其中至少有一些不是数字。如果您想查找可能有后缀的特定项目,您可以通过将字符串的开头与.str.startswith 进行比较来匹配它:

lookup = db.index.str.startswith("34567890")
title = db.loc[lookup, "Title"]

【讨论】:

以上是关于当数据框既是 int 又是字符串时,在 Dataframe 中查找行?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 JavaScript 中函数既是构造函数又是对象?

Golang | 既是接口又是类型,interface是什么神仙用法?

python 输入一个整数,判断其是否既是3的倍数,又是5的倍数

编程 判断输出1到100以内既是3的倍数又是5的倍数的数

如何使输入字段类型既是数字又是密码? [复制]

材料:声明不能既是“最终的”又是“动态的”