Как использовать условие равенства для манипулирования Pandas Dataframe на основе другого dataframe? - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть датафрейм в Python, скажем A, который имеет несколько столбцов, включая столбцы с именами ECode и FG. У меня есть еще один кадр данных Pandas B, также с несколькими столбцами, включая столбцы с именами ECode, F Gping (обратите внимание на пробел в имени столбца для F Gping) и EDesc. Я хотел бы создать новый столбец с именем EDesc в кадре данных A на основе следующих условий (обратите внимание, что EDesc, FG и F Gping содержат значения типа String (текст), а остальные столбцы имеют числовой / плавающий тип. Кроме того, фреймы данных A и B имеют разные размеры (с разными строками и столбцами, и я хочу проверить равенство в определенных значениях в столбцах фрейма данных): -

  1. Сначала для всех строк в фрейме данных A, где значение в ECode соответствует значению ECode в фрейме данных B, затем в новом столбце EDesc, который будет создан в фрейме данных A, добавьте те же значения, что и EDesc в B.
  2. Во-вторых, для всех строк в кадре данных A, где значение в FG соответствует F Gping значениям, в новом столбце EDesc в A добавьте те же значения, что и EDesc в B.
  3. После этого, если во вновь созданном столбце EDesc в A все еще отсутствуют значения / NaN, добавьте строковое значение MissingValue ко всем строкам в столбце Dataframe A EDesc.

Я пытался использовать циклы for, а также списки, но они не помогают в этом. Более того, пробел внутри имени столбца F Gping в B создает проблемы для доступа к нему, как будто я могу получить к нему доступ, как B['F Gping'], это не решает саму цель. Любая помощь в этом отношении приветствуется.

1 Ответ

1 голос
/ 06 апреля 2019

Я предполагаю, что значения уникальны в B ['ECode'] и B ['F Gping'], в противном случае нам придется выбирать, какое значение мы даем A ['EDesc'], когда мы находим два совпадающих значениядля ECode или FG.

Возможно, есть более разумный способ, но вот что я бы сделал с объединениями:

Пример фреймов данных:

A = pd.DataFrame({'ECode': [1, 1, 3, 4, 6],
                  'FG': ['a', 'b', 'c', 'b', 'y']})
B = pd.DataFrame({'ECode': [1, 2, 3, 5],
                  'F Gping': ['b', 'c', 'x', 'x'],
                  'EDesc': ['a', 'b', 'c', 'd']})

Так они выглядят так:

A
   ECode FG
0      1  a
1      1  b
2      3  c
3      4  b
4      6  y

B
   ECode F Gping EDesc
0      1       b     a
1      2       c     b
2      3       x     c
3      5       x     d

Сначала давайте создадим A ['EDesc'], сказав, что это результат объединения A и B в ECode.Мы временно будем использовать EDesc в качестве индекса:

A.set_index('ECode', inplace=True, drop=False)
B.set_index('ECode', inplace=True, drop=False)

A['EDesc'] = A.join(B, lsuffix='A')['EDesc']

Это работает, потому что результат A.join (B, lsuffix = 'A'):

       ECodeA FG  ECode F Gping EDesc
ECode                                
1           1  a    1.0       b     a
1           1  b    1.0       b     a
3           3  c    3.0       x     c
4           4  b    NaN     NaN   NaN
6           6  y    NaN     NaN   NaN

Теперь давайте заполнимна A ['EDesc'], используя совпадение на FG.То же самое:

A.set_index('FG', inplace=True, drop=False)
B.set_index('F Gping', inplace=True, drop=False)

A['EDesc'].fillna(A.join(B, lsuffix='A')['EDesc'].drop_duplicates(), inplace=True)

Это работает, потому что результат A.join (B, lsuffix = 'A'):

   ECodeA FG EDescA  ECode F Gping EDesc
a       1  a      a    NaN     NaN   NaN
b       1  b      a    1.0       b     a
b       4  b    NaN    1.0       b     a
c       3  c      c    2.0       c     b
y       6  y    NaN    NaN     NaN   NaN

Также мы удалили дубликаты, потому что, как вы можетевидим, что в нашем индексе два b.

Наконец, давайте заполним "Missing" и сбросим индекс:

A['EDesc'].fillna('Missing', inplace=True)
A.reset_index(drop=True, inplace=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...