[英]Replace numeric values in a pandas dataframe
问题 :污染的数据框。
详细信息:框架由我知道的NaN字符串值和数字值组成。
任务 :用NaN替换数值
例
import numpy as np
import pandas as pd
df = pd.DataFrame([['abc', 'cdf', 1], ['k', 'sum', 'some'], [1000, np.nan, 'nothing']])
出:
0 1 2
0 abc cdf 1
1 k sum some
2 1000 NaN nothing
尝试1 (无效,因为正则表达式仅查看字符串单元格)
df.replace({'\d+': np.nan}, regex=True)
出:
0 1 2
0 abc cdf 1
1 k sum some
2 1000 NaN nothing
初步解决方案
val_set = set()
[val_set.update(i) for i in df.values]
def dis_nums(myset):
str_s = set()
num_replace_dict = {}
for i in range(len(myset)):
val = myset.pop()
if type(val) == str:
str_s.update([val])
else:
num_replace_dict.update({val:np.nan})
return str_s, num_replace_dict
strs, rpl_dict = dis_nums(val_set)
df.replace(rpl_dict, inplace=True)
出:
0 1 2
0 abc cdf NaN
1 k sum some
2 NaN NaN nothing
问题是否有更简单/更愉快的解决方案?
您可以对str
进行一次str
以替换值并返回。
df.astype('str').replace({'\d+': np.nan, 'nan': np.nan}, regex=True).astype('object')
#This makes sure already existing np.nan are not lost
输出量
0 1 2
0 abc cdf NaN
1 k sum some
2 NaN NaN nothing
您可以使用循环遍历每列,并检查每一项。 如果它是整数或浮点数,则将其替换为np.nan。 使用列上的地图功能可以轻松完成此操作。
您可以更改if
的条件以合并所需的任何数据类型。
for x in df.columns:
df[x] = df[x].map(lambda item : np.nan if type(item) == int or type(item) == float else item)
这是一个幼稚的方法,必须有比这更好的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.