python - 当数据框既是 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。
解决方案
如果要将所有条目转换为一种特定类型,可以使用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)
推荐阅读
- reactjs - 没有找到反应浏览器路由器模块?
- php - 无法使用 file_get_contents 获取页面内容
- javascript - 通过 html 中的 Knockout 循环将值存储在变量中
- python - 以毫秒为单位获取总运行时间
- awk - grep 无法从 CSV 文件中删除模式
- react-native - 在 MainActivity.java 中找不到 onCreate()
- vb.net - 如何在 Datagridview 中获取与不同列值相关的列的不同值和列摘要
- java - GWT 编译无法运行程序 CreateProcess 错误=206
- android - 如何在独立于生命周期的类中处理 Observables?
- tensorflow - 将张量从较小的形状平铺到较大的形状