用 python pandas 比较两个字符串

Posted

技术标签:

【中文标题】用 python pandas 比较两个字符串【英文标题】:compare two strings with python pandas 【发布时间】:2021-07-03 08:47:10 【问题描述】:

我尝试比较数据框中的两列(字符串类型) :

if((MODEL_STANDARD_df['FT']== "4") and (MODEL_STANDARD_df['FT_CODE'] == ' ')):
    MODEL_STANDARD_df['ft2'] = "DIESEL"

但我收到此错误:

 Error in Python process: At line 18: <type 'exceptions.ValueError'>:
 The truth value of a Series is ambiguous. Use a.empty, a.bool(),
 a.item(), a.any() or a.all(). More info about this error

有什么办法解决这个问题吗?

谢谢

【问题讨论】:

您是否尝试使用错误消息进行搜索 - The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().?这些结果有帮助吗?如果其中任何一个结果回答了您的问题,请告诉我们哪一个,我们会将您的结果标记为重复。 这能回答你的问题吗? How to conditionally update DataFrame column in Pandas 【参考方案1】:

MODEL_STANDARD_df['FT']== "4"MODEL_STANDARD_df['FT_CODE'] == ' ' 的返回值是布尔系列,你不能在Series 上使用and。您可以使用布尔索引,例如:

MODEL_STANDARD_df['ft2'] = ""
MODEL_STANDARD_df.loc[ (MODEL_STANDARD_df['FT']== "4") & (MODEL_STANDARD_df['FT_CODE'] == ' '), 'ft2'] = "DIESEL"

以如下dataframe为例

FT    FT_CODE
4       3
4      ' '
4       2
4      ' '
5      ' '

(MODEL_STANDARD_df['FT']== "4")返回

0     True
1     True
2     True
3     True
4    False
Name: FT, dtype: bool

MODEL_STANDARD_df['FT_CODE'] == ' ' 返回

0    False
1     True
2    False
3     True
4     True
Name: FT_CODE, dtype: bool

&amp;and 的逻辑相同,即如果都为真则为真,所以两个布尔系列的&amp;

0    False
1     True
2    False
3     True
4    False
dtype: bool

Boolean indexing 表示只选择 True 行。

【讨论】:

它不创建列 ft2 @butter 在布尔索引之前添加MODEL_STANDARD_df['ft2'] = "" 怎么样? 我不理解所有 3 个解决方案,结果我得到一个空列:/ @butter FT 的列类型是什么?使用print(df.dtypes) 打印它,如果是int。考虑使用df['FT'].astype(str) 将列类型更改为str 或将== "4" 更改为== 4 好的,我将类型更改为小数.. 仍然无法正常工作【参考方案2】:

您必须从系列中提取值以创建一个布尔掩码,指示条件在两列中同时为真的位置使用 numpy 的logical_and 方法:

import numpy as np

MODEL_STANDARD_df.loc[np.logical_and(MODEL_STANDARD_df['FT'].values=="4",MODEL_STANDARD_df['FT_CODE'].values==' '), 'ft2'] = "DIESEL"

【讨论】:

【参考方案3】:

您可以在数据框中使用应用函数。请参见下面的示例:

MODEL_STANDARD_df = pd.DataFrame('FT': ["4", "1", "3"], "FT_CODE": [' ', '1', '4'])
MODEL_STANDARD_df['ft2'] = MODEL_STANDARD_df.apply(lambda x: "DIESEL" if x.FT == "4" and x.FT_CODE == " " else None, axis=1)

`

【讨论】:

同样的问题:空 ft2 让我看看我是否理解你的意思。您想在数据帧中创建第三列,如果 FT 列是 4 并且 FT_CODE 为空,则第三列将是“DIESEL”,对吗?和其他行,不满足条件时的值是多少? 自 24 小时以来仍然被阻止 :( 对不起,我没有理解你。谁或什么仍然被阻止?在 pandas 中,您不能将数据框列(即 pd.Series)评估为单个值。您可以使用 .loc 来检查在数据框中达到您的条件的位置,或者使用 apply 来为数据框中的每一行或每一列执行一个函数。如果你的问题是关于这个的,请说我。

以上是关于用 python pandas 比较两个字符串的主要内容,如果未能解决你的问题,请参考以下文章

Pandas之字符串操作

用Python写一个程序,提示输入两个字符串,然后进行比较,输出较小的字符串.要求只能使用单字符串比较操作

Pandas 系列字符串比较

Python - Pandas - 用正则表达式替换字符串| (要么)

Pandas:两个数据帧之间的精确字符串匹配,带有位置

python 用pandas DataFrame中的逗号将数字字符串转换为float。