![](/img/trans.png)
[英]Python Pandas - replace values with NAN in multiple columns based on mutliple dates?
[英]replace columns with NaN based on a string in pandas
我有以下数据框
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 替换列值呢?
您需要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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.