【问题标题】:compare two strings with python pandas用 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().?这些结果有帮助吗?如果其中任何一个结果回答了您的问题,请告诉我们哪一个,我们会将您的结果标记为重复。

标签: python pandas string


【解决方案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 来为数据框中的每一行或每一列执行一个函数。如果你的问题是关于这个的,请说我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 2020-09-05
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多