Условная замена чисел в пандах df - PullRequest
2 голосов
/ 05 апреля 2019

Учитывая следующие панды df:

import pandas as pd


df = pd.DataFrame({'1676' : ['R','NR','R','NR'],
               '1677' : ["NR", "NR" ,"NR", "NR"],
               '1710' : ["R", "R" , "NR", "NR"],
               '1536' : ["NR", "R", "NR", "R"]})

df
    1676    1677    1710    1536
0   R       NR      R       NR
1   NR      NR      R       R
2   R       NR      NR      NR
3   NR      NR      NR      R

и это более длинные панды df2:

df2 = pd.DataFrame({'1' : ['1710','1676','2651','1676'],
               '2' : ["2654", "2824" ,"1676", "1677"],
               '3' : ["1676", "3079" , "1677", "2085"],
               '4' : ["1536", "1677", "1409", "1536"],
                  '5' : ["510", "1710" , "1664", "1710"],
                  '6' : ["2590", "3090" , "2252", "2916"],
                  '7' : ["2777", "1536" , "1710", "3140"],
                  '8' : ["1677", "1709" , "1536", "1963"]})

    1       2       3       4       5       6       7       8
0   1710    2654    1676    1536    510     2590    2777    1677
1   1676    2824    3079    1677    1710    3090    1536    1709
2   2651    1676    1677    1409    1664    2252    1710    1536
3   1676    1677    2085    1536    1710    2916    3140    1963

Мне интересно, возможно ли следующее построчно (здесь для первого ряда):

  • для каждого значения в df.loc[0,] = "R"
  • взять имя соответствующего столбца (число)
  • поиск номера в df2.loc[0,]
  • номер замены в df2.loc[0,] с "R"

Чтобы я получил это:

    1       2       3       4       5       6       7       8
0   R       2654    R       1536    510     2590    2777    1677
1   1676    2824    3079    1677    R       3090    R       1709
2   2651    R       1677    1409    1664    2252    1710    1536
3   1676    1677    2085    R       1710    2916    3140    1963

редактировать

Это не работает для моих конкретных df's. Есть предположения, что вызывает эту проблему? Я уже пытался сбросить индексы.

Это df из поста выше:

enter image description here

Это df2 из поста выше:

enter image description here

Ответы [ 2 ]

4 голосов
/ 05 апреля 2019

Вот, пожалуйста, update с stack и lookup

s=df2.stack()
s=s[s.isin(df.columns)]
df2.update(pd.Series(df.mask(df=='NR').lookup(s.index.get_level_values(0),s),s.index).unstack())
df2
Out[103]: 
      1     2     3     4     5     6     7     8
0     R  2654     R  1536   510  2590  2777  1677
1  1676  2824  3079  1677     R  3090     R  1709
2  2651     R  1677  1409  1664  2252  1710  1536
3  1676  1677  2085     R  1710  2916  3140  1963
4 голосов
/ 05 апреля 2019

Используйте np.where и replace:

import numpy as np
r, c = np.where(df=='R')

df2.apply(lambda x: x.replace(df.columns[c[(r == x.name)]], 'R'), axis=1)

Выход:

      1     2     3     4     5     6     7     8
0     R  2654     R  1536   510  2590  2777  1677
1  1676  2824  3079  1677     R  3090     R  1709
2  2651     R  1677  1409  1664  2252  1710  1536
3  1676  1677  2085     R  1710  2916  3140  1963

подробности:

  • Сначала найдите строку и столбцы в df, где равно 'R'
  • Используйте apply с axis = 1 для перехода строка за строкой, x.name определяет, какая строка Индекс искать позицию в C, где это равно индекс строки и получить заголовок столбца от df в этой позиции.
  • Используйте replace, чтобы заменить все значения заголовка столбца в df, на этом строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...