将包含字符串的 Pandas 系列转换为布尔值
Posted
技术标签:
【中文标题】将包含字符串的 Pandas 系列转换为布尔值【英文标题】:Convert Pandas series containing string to boolean 【发布时间】:2013-07-16 03:39:55 【问题描述】:我有一个名为 df
的 DataFrame
Order Number Status
1 1668 Undelivered
2 19771 Undelivered
3 100032108 Undelivered
4 2229 Delivered
5 00056 Undelivered
我想将Status
列转换为布尔值(True
状态已交付,False
状态未交付)
但如果状态既不是“未交付”也不是“已交付”,则应将其视为NotANumber
或类似的东西。
我想使用字典
d =
'Delivered': True,
'Undelivered': False
所以我可以轻松添加其他字符串,可以视为True
或False
。
【问题讨论】:
【参考方案1】:你可以使用map
:
In [7]: df = pd.DataFrame('Status':['Delivered', 'Delivered', 'Undelivered',
'SomethingElse'])
In [8]: df
Out[8]:
Status
0 Delivered
1 Delivered
2 Undelivered
3 SomethingElse
In [9]: d = 'Delivered': True, 'Undelivered': False
In [10]: df['Status'].map(d)
Out[10]:
0 True
1 True
2 False
3 NaN
Name: Status, dtype: object
【讨论】:
我得到AttributeError: 'DataFrame' object has no attribute 'map'
。
map
是 Series 上的方法,而不是 DataFrame。
是的,很抱歉。【参考方案2】:
replace
方法示例,仅替换指定列 C2
中的值并以 DataFrame
类型获取结果。
import pandas as pd
df = pd.DataFrame('C1':['X', 'Y', 'X', 'Y'], 'C2':['Y', 'Y', 'X', 'X'])
C1 C2
0 X Y
1 Y Y
2 X X
3 Y X
df.replace('C2': 'X': True, 'Y': False)
C1 C2
0 X False
1 Y False
2 X True
3 Y True
【讨论】:
虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高答案的长期价值。【参考方案3】:您拥有所需的一切。你会很高兴发现replace
:
df.replace(d)
【讨论】:
啊,我现在才看到我发布了我的答案。在这种情况下与map
有区别吗?
似乎其他东西(不在差异中)只剩下replace
,但转换为NaN
和map
我认为map
实际上是一个更好的选择,因为如果一个值不在d
中,那么该值是无效的,应该用NaN
替换。
replace
似乎适用于 DataFrame 而不是 Serie
两者都适用。我的链接是 DataFrame 文档;这是系列的一个。 pandas.pydata.org/pandas-docs/dev/generated/…【参考方案4】:
扩展之前的答案:
地图方法说明:
Pandas 将在对应的d
字典中查找每一行的值,将找到的任何键替换为来自 d
的值。
d
中没有键的值将设置为NaN
。这可以通过fillna()
方法纠正。
不适用于多列,因为 pandas 在此处通过序列化 pd.Series
进行操作。
文档:pd.Series.map
d = 'Delivered': True, 'Undelivered': False
df["Status"].map(d)
替换方法说明:
Pandas 将在对应的d
字典中查找每一行的值,并尝试将找到的任何键替换为来自 d
的值。
d
中没有键的值将被保留。
适用于单列和多列(pd.Series
或 pd.DataFrame
对象)。
文档:pd.DataFrame.replace
d = 'Delivered': True, 'Undelivered': False
df["Status"].replace(d)
总体而言,replace 方法更健壮,并且可以更好地控制数据的映射方式以及如何处理缺失值或 nan 值。
【讨论】:
以上是关于将包含字符串的 Pandas 系列转换为布尔值的主要内容,如果未能解决你的问题,请参考以下文章
如何使用空值将字符串转换为日期时间 - python,pandas?