将包含字符串的Pandas系列转换为布尔值。

49

我有一个名为df的DataFrame,如下所示:

  Order Number       Status
1         1668  Undelivered
2        19771  Undelivered
3    100032108  Undelivered
4         2229    Delivered
5        00056  Undelivered
我希望将Status列转换为布尔型,当状态为Delivered时为True,状态为Undelivered时为False。但是,如果状态既不是'Undelivered'也不是'Delivered',则应将其视为NotANumber或类似的内容。
我想使用一个字典。
d = {
  'Delivered': True,
  'Undelivered': False
}

所以我可以轻松地添加其他字符串,这些字符串可能被视为True或者False

4个回答

65
你可以直接使用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'错误。 - gwthm.in
map 是 Series 上的方法,而不是 DataFrame。 - joris
好的,我明白了,对不起。 - gwthm.in

19

使用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

2
虽然这段代码可能回答了问题,但提供有关它如何以及/或为什么解决问题的附加上下文将改善答案的长期价值。 - Donald Duck

13

在之前的答案上进行扩展:

Map 方法解释:

  • 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)

总的来说,替换方法更加健壮,可以更精细地控制数据映射和处理缺失或NaN值。



7

您已经拥有了一切必要的东西。您会很高兴地发现replace函数:

df.replace(d)

啊,我现在才看到我发布了我的答案。在这种情况下,使用map有什么区别吗? - joris
似乎还有其他东西(不在dift中)只是用replace替换,但用map转换为NaN - joris
3
我认为在这里map是更好的选择,因为如果一个值不在d中,那么该值是无效的,应该用NaN替换。 - Dan Allan
“replace” 似乎适用于 DataFrame 而不是 Series。 - working4coins
适用于两者。我的链接是DataFrame文档; 这是一个Series的链接。http://pandas.pydata.org/pandas-docs/dev/generated/pandas.Series.replace.html - Dan Allan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接