替换pandas数据帧中的数值

时间:2018-04-19 10:03:44

标签: python pandas dataframe replace

问题:污染的数据帧。
细节:框架由NaNs字符串值组成,我知道数字值的含义。
任务:用NaNs替换数值 示例

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

问题 有没有更简单/更愉快的解决方案?

2 个答案:

答案 0 :(得分:1)

您可以对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

答案 1 :(得分:0)

您可以使用循环遍历每个列,并检查每个项目。如果是整数或浮点数,则用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)

这是一种天真的方法,必须有比这更好的解决方案。!!