【问题标题】:How to add an index of a another dataframe如何添加另一个数据框的索引
【发布时间】:2019-09-30 19:48:34
【问题描述】:

我有两个不同的数据框。首先,我必须检查我的 df1 中的数据是否与我的 df2 匹配。如果是这种情况,它会添加一个列“isRep”=true,否则它等于 false。它为我创建了一个 df3。

现在,我需要在我的df3中添加一个与索引对应的“idRep”列,用pandas自动生成,在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    -

【问题讨论】:

  • 问题/期望的输出是什么?
  • 我需要一个新的数据框,其中包含“IdRep”列,就像我解释中的最后一个示例一样

标签: python pandas numpy dataframe


【解决方案1】:

使用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()
)

【讨论】:

  • 不客气。请将此答案视为探索性练习。您正确选择了@user3483203 的答案 (-:
【解决方案2】:

在合并之前,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

【讨论】:

  • 这很简单。我喜欢它。
猜你喜欢
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
  • 2023-01-10
  • 2013-10-16
相关资源
最近更新 更多