Замените значения столбцов именами столбцов в пандах - PullRequest
0 голосов
/ 01 февраля 2019

Мой фрейм данных выглядит следующим образом:

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

Также у меня есть словарь, в котором написано

dict:

{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 голосов
/ 01 февраля 2019

Если все ваши исходные DataFrame являются строками, вы можете сделать это:

   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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...