【问题标题】:Convert Pandas series containing string to boolean将包含字符串的 Pandas 系列转换为布尔值
【发布时间】: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

【问题讨论】:

    标签: python pandas boolean type-conversion series


    【解决方案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 值。

    【讨论】:

      猜你喜欢
      • 2023-02-01
      • 2018-09-07
      • 1970-01-01
      • 2022-06-15
      • 2020-03-22
      • 1970-01-01
      • 2012-03-10
      • 2012-12-16
      • 1970-01-01
      相关资源
      最近更新 更多