将包含字符串的 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

所以我可以轻松添加其他字符串,可以视为TrueFalse

【问题讨论】:

【参考方案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,但转换为NaNmap 我认为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.Seriespd.DataFrame 对象)。 文档:pd.DataFrame.replace
d = 'Delivered': True, 'Undelivered': False
df["Status"].replace(d)

总体而言,replace 方法更健壮,并且可以更好地控制数据的映射方式以及如何处理缺失值或 nan 值。

【讨论】:

以上是关于将包含字符串的 Pandas 系列转换为布尔值的主要内容,如果未能解决你的问题,请参考以下文章

将字符串转换为布尔值[重复]

如何使用空值将字符串转换为日期时间 - python,pandas?

我们如何将字符串转换为布尔值? [复制]

将字符串“true”/“false”转换为布尔值[duplicate]

如何在 JavaScript 中将字符串转换为布尔值?

将包含字符串和 NAN 的列转换为 Pandas 中的整数列表