получить соответствующее значение столбца из другого панда данных - PullRequest
0 голосов
/ 23 октября 2018

Ниже приведены два кадра данных, которые я сравниваю.Я хотел бы получить соответствующее значение столбца в столбце Usage в df2, когда смогу сопоставить столбец Item.Ценю помощь.

df1 = pd.DataFrame({ 'Number':[1.0,3.0,4.0,5.0,8.0,12.0,32.0,58.0,72.0] , 'Item': ['Phone', 'Watch', 'Pen', 'Pencil', 'Pencil', 'toolkit', 'box', 'fork', 'toy']})
df2 = pd.DataFrame({'Number':[3.0, 4.0, 8.0, 12.0, 15.0, 32.0, 54.0, 58.0, 72.0], 'Item':['Watch', 'Pen', 'Pencil', 'Eraser', 'bottle', 'box', 'toolkit', 'fork', 'Phone'], 'Usage':['Time', 'Writing', 'Writing', 'Cleaning', 'Water', 'storage', 'Utility', 'Eat', 'Communication']})

df1
   Number     Item
0     1.0    Phone
1     3.0    Watch 
2     4.0      Pen
3     5.0   Pencil
4     8.0   Pencil   
5    12.0  toolkit
6    32.0      box
7    58.0     fork
8    72.0      toy

df2
   Number     Item          Usage
0     3.0    Watch           Time
1     4.0      Pen        Writing
2     8.0   Pencil        Writing
3    12.0   Eraser       Cleaning
4    15.0   bottle          Water
5    32.0      box        storage
6    54.0  toolkit        Utility
7    58.0     fork            Eat
8    72.0    Phone  Communication

Код, используемый для сопоставления, приведен ниже.Он говорит «MatchedBoth», даже когда совпадает только номер.Это нужно исправить.

import numpy as np
df3 = df1.copy()
df3['Matching'] = np.nan
df3.loc[(df3.Number.isin(df2.Number)) & (df3.Item.isin(df2.Item)), 'Matching'] = 'MatchedBoth'
df3.loc[(df3.Number.isin(df2.Number)) & (~df3.Item.isin(df2.Item)),'Matching'] = 'Matched Number Only'
df3.Matching.fillna('No Match', inplace=True)

В том же коде есть возможность встроить возвращаемое значение, которое может извлечь значение столбца Usage из df2, соответствующее каждой соответствующей строке.Это может быть случай, когда есть несколько строк, которые могут совпадать, и, следовательно, нам может понадобиться получить соответствующие значения столбца Usage в список или что-то подобное в окончательном выводе.

Примечание. В моем реальном фрейме данных у меня есть несколько столбцов, и, следовательно, если я использую слияние, это приводит к огромному фрейму данных.Я просто хотел бы создать новый столбец со списком соответствующих совпавших значений, найденных в столбце Usage в df2.

Вывод должен выглядеть примерно так:

df3
   Number     Item             Matching    Usage
0     1.0    Phone             No Match      NaN
1     3.0    Watch          MatchedBoth     Time
2     4.0      Pen          MatchedBoth  Writing
3     5.0   Pencil             No Match      NaN
4     8.0   Pencil          MatchedBoth  Writing 
5    12.0  toolkit  Matched Number Only  Utility
6    32.0      box          MatchedBoth  storage
7    58.0     fork          MatchedBoth      Eat
8    72.0      toy  Matched Number Only     Play

1 Ответ

0 голосов
/ 23 октября 2018

Вы можете попробовать что-то вроде этого:

df3 = df1.merge(df2, on='Number', how='left')
df3['Matching'] = np.where(df3.Productdetailed == df3.Item, 'Matched', 'No Match')
df3.drop('Productdetailed', axis=1, inplace=True)

, который вернет результат, указанный вами в вашем вопросе.

РЕДАКТИРОВАТЬ после уточнения:

def find_match(row):
  if (row.Number in df2.Number.values) & (row.Item in df2.Item.values):
      return "MatchedBoth"
  elif ((row.Number in df2.Number.values) & ~(row.Item in df2.Item.values)):
      return "Matched Number Only"
  else:
      return "No Match"

df3['Matching'] = df3.apply(find_match, axis=1)
df3['Usage'] = df3.Item.map(df2.set_index('Item').Usage)
...