用 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
&
与and
的逻辑相同,即如果都为真则为真,所以两个布尔系列的&
是
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 比较两个字符串的主要内容,如果未能解决你的问题,请参考以下文章
用Python写一个程序,提示输入两个字符串,然后进行比较,输出较小的字符串.要求只能使用单字符串比较操作