当前位置: 首页 > 面试题库 >

pandas-合并字符串列不起作用(错误?)

华子昂
2023-03-14
问题内容

我正在尝试在两个数据框之间进行简单合并。它们来自两个不同的SQL表,其中连接键是字符串:

>>> df1.col1.dtype
dtype('O')
>>> df2.col2.dtype
dtype('O')

我尝试使用以下方法合并它们:

>>> merge_res = pd.merge(df1, df2, left_on='col1', right_on='col2')

内部联接的结果为空,这首先提示我相交中可能没有任何条目:

>>> merge_res.shape
(0, 19)

但是当我尝试匹配单个元素时,我看到了这种非常奇怪的行为。

# Pick random element in second dataframe
>>> df2.iloc[5,:].col2
'95498208100000'

# Manually look for it in the first dataframe
>>> df1[df1.col1 == '95498208100000']
0 rows × 19 columns
# Empty, which makes sense given the above merge result

# Now look for the same value as an integer
>>> df1[df1.col1 == 95498208100000]
1 rows × 19 columns
# FINDS THE ELEMENT!?!

因此,这些列是使用’object’dtype定义的。以字符串搜索它们不会产生任何结果。将它们搜索为整数确实会返回结果,并且我认为这就是合并在上方无法正常工作的原因。

有什么想法吗?

几乎有人认为Pandas可以df1.col1将其转换为整数,即使它在匹配 时应 被视为字符串。

(我尝试使用示例数据帧来复制此示例,但是对于较小的示例,我看不到这种行为。关于如何找到更具描述性的示例的任何建议也将不胜感激。)


问题答案:

问题是objectdtype具有误导性。我认为这意味着所有项目都是字符串。但是很明显,在读取文件时,pandas正在将某些元素转换为int,其余部分则保留为字符串。

解决方案是确保每个字段都是一个字符串:

>>> df1.col1 = df1.col1.astype(str)
>>> df2.col2 = df2.col2.astype(str)

然后合并按预期方式工作。

(我希望能有指定的方式dtypestr…)



 类似资料:
  • 问题内容: 我有2个数据框,格式如下: 完整的df_search有15,000个项目。df_all有550,000个项目。我正在尝试基于文件字符串中的搜索项目字符串来合并两个数据框。我想要的输出是这样的: 简单的数据框合并不起作用,因为字符串永远不会完全匹配(它始终是子字符串)。我还根据其他关于stackoverflow的问题尝试了以下方法: 这给了我df_all中所有找到的项目的完整列表,但是我

  • 问题内容: 我有2个数据框,我想将它们合并到一个公共列上。但是,我要合并的列不是同一字符串,而是另一个中包含一个字符串,如下所示: 我想要的结果如下: 问题答案: 新答案 这是一种基于pandas / numpy的方法。 旧答案 这是左联接行为的一种解决方案,因为它不会保留不匹配任何值的值。这比上面的numpy / pandas解决方案要慢,因为它使用两个嵌套循环来构建python列表。

  • 代码如下: 运行时,这是错误消息: 错误:不匹配'运算符*'(操作数类型是'std::__cxx11::字符串{aka std::__cxx11::basic_string 如何修复此错误并使程序正确运行?

  • 问题内容: 我最初尝试使用运算符分配值,但返回了错误,然后尝试使用 : 和 但是它正在返回原始价值。 提供有关如何正确使用替换API以获得正确结果的帮助。还有其他任何可用的API可以代替 。 在正在从用户采取的 是由用户的频率串被输入。这个问题几乎不涉及我想知道我是否使用了错误的API变量,因为它为我提供了不变的输出, 我们是否可以使用 从字符串中返回一个字符 来定义API的子字符串。我使用 最大

  • 问题内容: 我了解到删除前导和尾随空格。但是在我的情况下,它无法正常工作,我正在尝试使用以下代码,但是输出的前导和尾随空格。但是我的期望是文本没有开头和结尾的空格。这是我的代码。 请帮我 问题答案: 您需要将结果重新分配给: 请记住, Java中的字符串是不可变的 ,因此 几乎 所有的String类方法都将创建并返回新的字符串,而不是就地修改字符串。 尽管这是题外话,但是(正如我在那所说的),值得

  • 我正在学习Java程序。我需要一个帮助,我想返回的值,存储在if条件。在下面的代码中,如果名称的长度大于或等于6,则先取5个字符,然后追加两次年龄,最后再追加6个字符。 例如:如果字符为alisha,则返回alish2727a

  • 我有以下形式的数据帧: 我想替换几个字符串,但其中一些字符串之后会有相同的输出。所以现在我用的是: 这将导致预期的结果: 但是命令行变得有些混乱,有没有更聪明的方法来做到这一点?类似于: 如果我尝试,这个逻辑:正则表达式匹配两个单词中的一个

  • 我在名为的类中有一个链表,它包含以下属性: 我有另一个类,它是“实际列表”,它只包含对列表头部的引用,这个类被称为“文本列表”,它接收一个字符串,并假设将该字符串的每个单词排序在列表中。例如,对于句子: 链接列表如下所示: 箭头就像指向列表中下一个节点的指针。 我想先把所有的单词放在一个链表中(类),然后做一个MERGE SORT来对链表中的单词进行排序。 我想做的是采用拆分方法将列表拆分为两个列