【问题标题】:replace columns with NaN based on a string in pandas根据 pandas 中的字符串用 NaN 替换列
【发布时间】:2017-01-25 12:17:51
【问题描述】:

我有以下数据框

ipdb> csv_data
  country_edited sale_edited  date_edited  transformation_edited
0          India      403171     20090101                     10
1         Bhutan      394096     20090101                     20
2          Nepal    Set Null     20090101                     30
3         madhya      355883     20090101                     40
4          sudan    Set Null     20090101                     50

我想将所有包含Set Null 的列值替换为Nan,所以我采用了以下方式

import numpy

def set_NaN(element):
    if element == 'Set Null':
        return numpy.nan
    else:
        return element

csv_data = csv_data.applymap(lambda element: set_NaN(element))

但它并没有改变任何东西

ipdb> print csv_data
  country_edited sale_edited  date_edited  transformation_edited
0          India      403171     20090101                     10
1         Bhutan      394096     20090101                     20
2          Nepal    Set Null     20090101                     30
3         madhya      355883     20090101                     40
4          sudan    Set Null     20090101                     50
ipdb>

但是当我只打印csv_data.applymap(lambda element: set_NaN(element)) 时,如下所示,我可以看到输出,但是当分配回来时,我无法获得我想要的数据

ipdb> csv_data.applymap(lambda element: set_NaN(element))
  country_edited sale_edited  date_edited  transformation_edited
0          India      403171     20090101                     10
1         Bhutan      394096     20090101                     20
2          Nepal         NaN     20090101                     30
3         madhya      355883     20090101                     40
4          sudan         NaN     20090101                     50

那么如何根据某个字符串将列值替换为 NaN 呢?

【问题讨论】:

  • 你有什么收获吗:csv_data = csv_data.applymap(set_NaN)。此外,applymap 需要一个可调用对象,因此这里不需要额外的 lambda
  • 好吧我不知道,我是熊猫新手

标签: python pandas python-applymap


【解决方案1】:

您需要DataFrame.mask,它将掩码的True 值替换为NaN。还有一些列是数字的,所以首先需要将df 的值转换为string

print (csv_data.astype(str) == 'Set Null')
  country_edited sale_edited date_edited transformation_edited
0          False       False       False                 False
1          False       False       False                 False
2          False        True       False                 False
3          False       False       False                 False
4          False        True       False                 False


csv_data = csv_data.mask(csv_data.astype(str) == 'Set Null')
print (csv_data)
  country_edited sale_edited  date_edited  transformation_edited
0          India      403171     20090101                     10
1         Bhutan      394096     20090101                     20
2          Nepal         NaN     20090101                     30
3         madhya      355883     20090101                     40
4          sudan         NaN     20090101                     50

numpy boolean mask 的另一个解决方案 - 通过DataFrame.values 比较 numpy 数组:

print (csv_data.values == 'Set Null')
[[False False False False]
 [False False False False]
 [False  True False False]
 [False False False False]
 [False  True False False]]

csv_data = csv_data.mask(csv_data.values == 'Set Null')
print (csv_data)
  country_edited sale_edited  date_edited  transformation_edited
0          India      403171     20090101                     10
1         Bhutan      394096     20090101                     20
2          Nepal         NaN     20090101                     30
3         madhya      355883     20090101                     40
4          sudan         NaN     20090101                     50

在您的解决方案中,有必要将数据分配回csv_data

def set_NaN(element):
    if element == 'Set Null':
        return numpy.nan
    else:
        return element

csv_data = csv_data.applymap(lambda element: set_NaN(element))
print (csv_data)
  country_edited sale_edited  date_edited  transformation_edited
0          India      403171     20090101                     10
1         Bhutan      394096     20090101                     20
2          Nepal         NaN     20090101                     30
3         madhya      355883     20090101                     40
4          sudan         NaN     20090101                     50

【讨论】:

    猜你喜欢
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 2017-08-21
    相关资源
    最近更新 更多