Как добавить индекс другого фрейма данных - PullRequest
3 голосов
/ 13 мая 2019

У меня есть два разных кадра данных. Сначала я должен был проверить, что данные в моем df1 соответствуют моему df2. Если это так, добавьте столбец «isRep» = true, иначе он равен false. Он создал для меня df3.

Теперь мне нужно добавить столбец «idRep» в моем df3, который соответствует индексу, генерировать автоматически с помощью панд, где найти данные в df2

Это df1:

Index      Firstname      Name       Origine
  0        Johnny         Depp       USA
  1        Brad           Pitt       USA
  2        Angelina       Pitt       USA

Это d2:

Index      Firstname      Name       Origine
  0        Kidman         Nicole     AUS
  1        Jean           Dujardin   FR
  2        Brad           Pitt       USA

После слияния с этим кодом:

df = pd.merge(data, dataRep, on=['Firstname', 'Name', 'Origine'], how='left', indicator='IsRep')
df['IsRep'] = np.where(df.IsRep == 'both', True, False)

после этого кода, я получил этот результат, который является моим df3 (то же самое, что и df1, но со столбцом "isRep"):

Index      Firstname      Name       Origine   isRep
  0        Johnny         Depp       USA       False
  1        Brad           Pitt       USA       True
  2        Angelina       Pitt       USA       False

Теперь мне нужен другой фрейм данных со столбцом с именем "idRep", где я помещаю индекс, соответствующий df2, как это. Но я не знаю, как я могу это сделать:

Index      Firstname      Name       Origine   isRep    IdRep
  0        Johnny         Depp       USA       False    -
  1        Brad           Pitt       USA       True     2
  2        Angelina       Pitt       USA       False    -

Ответы [ 2 ]

2 голосов
/ 13 мая 2019

Немного хака было бы до reset_index до того, как вы слились. Сбрасывайте только индекс в правом DataFrame.


m = dataRep.rename_axis('IdRep').reset_index()

df = pd.merge(data, m, on=['Firstname', 'Name', 'Origine'], how='left', indicator='IsRep')
df['IsRep'] = np.where(df.IsRep == 'both', True, False)

  Firstname  Name Origine  IdRep  IsRep
0    Johnny  Depp     USA    NaN  False
1      Brad  Pitt     USA    2.0   True
2  Angelina  Pitt     USA    NaN  False
1 голос
/ 13 мая 2019

обратный просмотр с использованием dict

cols = ['Firstname', 'Name', 'Origine']
d = dict(zip(zip(*map(df2.get, cols)), df2.index))
z = [*zip(*map(df1.get, cols))]

df1.assign(
    isRep=[*map(d.__contains__, z)],
    IdRep=[*map(d.get, z)]
)

      Firstname  Name Origine  isRep  IdRep
Index                                      
0        Johnny  Depp     USA  False    NaN
1          Brad  Pitt     USA   True    2.0
2      Angelina  Pitt     USA  False    NaN

Вариант, в котором мы используем assign аргументы, зависящие от порядка

cols = ['Firstname', 'Name', 'Origine']
d = dict(zip(zip(*map(df2.get, cols)), df2.index))
z = [*zip(*map(df1.get, cols))]

df1.assign(
    IdRep=[*map(d.get, z)],
    isRep=lambda d: d.IdRep.notna()
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...