【问题标题】:TypeError: unsupported operand type(s) for -: 'str' and 'str' | pandas reindexTypeError: 不支持的操作数类型 -: 'str' 和 'str' |熊猫重新索引
【发布时间】:2021-12-14 12:05:50
【问题描述】:

我得到了一个冗长的错误回溯,最后一行如标题中所述。

我正在尝试使用nearest 方法在重新索引期间填充缺失值。

这是我的代码:

import pandas as pd
s1=pd.Series([1,2,3,4],index=list('aceg'))
print(s1.reindex(pd.Index(list('abdg')),method='nearest'))

我试图查看是否在重新索引之后或在重新索引期间完成了填充缺失的信息,这可能会影响method = 'nearest' 这种情况下的结果。 将method 更改为ffillbfill 可以正常工作。

【问题讨论】:

  • 正如错误消息所说,您无法使用字符串和最近的重新索引。您必须用数字替换字符串。

标签: python-3.x pandas reindex


【解决方案1】:

用字符串不可能做到这一点,因为两个字符串之间的距离没有多大意义。对于这个用例,您可以使用 ord 函数将单字符索引转换为数字:

s1 = pd.Series([1,2,3,4], index=list('aceg'))
idx = pd.Index(list('gdba'))

s1.index = idx[s1.index.map(ord).reindex(idx.map(ord), method='nearest')[1]]
print(s1)

# Output:
a    1
b    2
d    3
g    4
dtype: int64

详情:

>>> s1.index.map(ord)
Int64Index([97, 98, 100, 103], dtype='int64')

>>> idx.map(ord)
Int64Index([103, 100, 98, 97], dtype='int64')

如果你有字符串索引而不是单字符索引,你可以用模糊逻辑和Levenshtein distance处理它

【讨论】:

  • 这不是有点奇怪,因为像我这样的普通用户会期望它能够工作,因为缺失值可以尝试查看附近的值并选择最近的值。当索引在这里无关紧要时,为什么需要特定类型的索引,因为当前数据的顺序可以判断哪个有效值最接近
  • 计算日期/数字之间的距离并找到最接近的值很容易,但要了解字符串并不容易。你有两个字符串:'hello'和'bye':哪个最接近'hello'? 'bye' 似乎是最接近的,虽然 'hello' 而 'bonjour' 在法语中的意思是 'hello'。
  • 所以它试图在数据框中查看有价值的差异而不是空间距离?
猜你喜欢
  • 2017-08-24
  • 2013-02-20
  • 2018-12-06
  • 1970-01-01
  • 2021-01-03
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多