Python 用表中的列名替换列值

Python 用表中的列名替换列值,python,pandas,dataframe,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,它都应该用列名填充,无论哪里

我的数据框架如下:

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对象没有属性列


我必须为多个表重复做同样的事情,如果有人能帮我解决这个问题,我将不胜感激

如果原始数据帧都是字符串,则可以执行以下操作:

   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

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

您的原始
DataFrame
是否都是
str
类型?i、 e.是
Nan
actual
np.Nan
还是sting
Nan
?@yatu它是np.Nan是实际的np.Nan,您的函数也在Nan的位置填充列名。请参阅我的最新变体
d={{str k:'{}-{}。k的格式(v),v在d.items(),'Nan:np.Nan}
中,其中
np.Nan。另外,
'nan'
是被强制时的
str
,所以它应该仍然可以工作。看起来像
d={**{str(k):{{}-{}。k的格式(v),在d.items()},'nan':np.nan}
没有像我使用python 2.7那样工作。如果我使用**我明白了,这会给我带来无效的语法。然后您只需将
d
的定义最初更改为结果:
d={'1':{}-triple',2':{}-millive',3':{}-Severe',nan':np.nan}
。问题是
items()
在Python 2.7中语法无效,我不确定
**
解包是否有效。我已经更新了包含Python 2.7变体的答案。它应该可以工作,但我手头没有Python2.7来测试完整的东西。