【问题标题】:Mapping boolean with np.vectorize in Python在 Python 中使用 np.vectorize 映射布尔值
【发布时间】:2020-09-15 16:37:39
【问题描述】:

我在 pandas df 中有这两列:

     seconds       min
0              52  0.866667
1               5  0.083333
2              10  0.166667
3               5  0.083333
4              16  0.266667
197           144  2.400000

只有当 ['seconds'] 大于 60 时,我想在 ['min'] 列中将秒转换为分钟,否则它应该为空。

我尝试将 ['min'] 列转换为布尔值:

    x = df['min'] = np.array(df['seconds'].apply(lambda x: True if x >60 else False))

我得到了布尔值,然后我尝试映射它:

    mapping = [df['seconds']/60]
    result = np.vectorize(lambda i:mapping[i], x)

但我得到了回报:

TypeError: 列表索引必须是整数或切片,而不是 str

这是正确的方法还是有其他更简单的解决方案?

输出:

    seconds       min
0              52  
1               5  
2              10  
3               5  
4              16  
197           144  2.400000

【问题讨论】:

  • 去掉'True'和'False'的引号
  • 谢谢,我没有注意到,但我得到了返回 IndexError: list index out of range
  • 请发布您的预期输出
  • 貌似也应该有逗号result = np.vectorize(lambda i:mapping[i], x)
  • @Techniquab 是的,谢谢。我纠正了它。我更新了输出。

标签: python pandas boolean


【解决方案1】:

我不确定如何使用您的矢量化方法,但以下方法可行

df.loc[df['seconds']<60,'min'] = 0
df.loc[df['seconds']>60,'min'] = df['seconds'][df['seconds']>60] /60    

【讨论】:

  • 我明白了,谢谢。我想在我有 False 的地方映射 [df['seconds']>60] /60。
【解决方案2】:

您的 'True' 和 'False' 是不是布尔值的字符串。布尔值没有引号

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 2021-12-14
    • 2014-11-27
    • 1970-01-01
    相关资源
    最近更新 更多