用pandas中的列名替换列值

时间:2019-02-01 17:17:58

标签: python pandas dataframe

我的数据框如下:

ASD   ASP   TOF   SVC   OLIP
x    Nan    1     3      x
Nan   x    Nan    Nan    x
Nan  Nan    x     Nan    3
3    Nan    Nan   Nan    x

我还有一本字典,上面写着

字典:

{1 : Trivial
 2 : Mild
 3 : Severe
}

现在,我试图以这种方式填充和转换我的数据框,使得无论在哪里x都应该用列名填充它,而在哪里数字都应该用列名-dict值填充它。

预期数据帧进行:

ASD        ASP   TOF          SVC         OLIP
ASD        Nan  TOF-Trivial  SVC-Severe   OLIP
Nan        ASP   Nan          Nan         OLIP
Nan        Nan   TOF          Nan         OLIP-Severe
ASD-Severe Nan   Nan          Nan         OLIP

我尝试了以下代码

df.apply(lambda x: x.replace(to_replace='x', value=df.columns.to_series())`

但是给我一个错误,表明AttributeError:Series对象没有属性列。

我必须为多个表重复做同样的事情,如果有什么可以帮助我解决这个问题,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

如果原始的 ASD ASP TOF SVC OLIP 0 x Nan 1 3 x 1 Nan x Nan Nan x 2 Nan Nan x Nan 3 3 3 Nan Nan Nan x d = { 1 : 'Trivial', 2 : 'Mild', 3 : 'Severe' } df.apply(lambda x: x.apply(lambda y: {**{str(k): '{}-{}'.format(x.name, v) for k, v in d.items()}, 'nan': 'Nan'}.get(y.lower(), x.name))) ASD ASP TOF SVC OLIP 0 ASD Nan TOF-Trivial SVC-Severe OLIP 1 Nan ASP Nan Nan OLIP 2 Nan Nan TOF Nan OLIP-Severe 3 ASD-Severe Nan Nan Nan OLIP 都是字符串,则可以执行以下操作:

str

如果不是,可以随时把该类型为apply,然后df.apply(lambda x: x.astype(str).apply(lambda y: {**{str(k): '{}-{}'.format(x.name, v) for k, v in d.items()}, 'nan': 'Nan'}.get(y.lower(), x.name))) ,第二层:

d = {**{str(k): '{{}}-{}'.format(v) for k, v in d.items()}, 'nan': 'Nan'}

# {'1': '{}-Trivial', '2': '{}-Mild', '3': '{}-Severe', 'nan': 'Nan'}

# Or if you want the final result to be actually np.nan:

d = {**{str(k): '{{}}-{}'.format(v) for k, v in d.items()}, 'nan': np.nan}

# On python 2.7 you need to do this instead:

d = {str(k): '{{}}-{}'.format(v) for k, v in d.iteritems()}
d['nan'] = np.nan

# Or just redefine 'd' manually:

d = {'1': '{}-Trivial', '2': '{}-Mild', '3': '{}-Severe', 'nan': np.nan}

# After 'd' is setup define a custom function

def func(val, name):
    result = d.get(val.lower(), '{}')
    if type(result) == str:
        return result.format(name)
    else:
        return result

# call the custom function in the second layer of apply

df.apply(lambda x: x.astype(str).apply(lambda y: func(y.lower(), x.name)))

          ASD  ASP          TOF         SVC         OLIP
0         ASD  NaN  TOF-Trivial  SVC-Severe         OLIP
1         NaN  ASP          NaN         NaN         OLIP
2         NaN  NaN          TOF         NaN  OLIP-Severe
3  ASD-Severe  NaN          NaN         NaN         OLIP

如果您可以提前重新定义字典,可能会更有效:

      src1.cpp includes header.h
      src2.cpp includes header.h