【问题标题】:Replace a subset of pandas data frame with another data frame用另一个数据框替换熊猫数据框的子集
【发布时间】:2019-12-21 11:16:30
【问题描述】:

我有一个包含 100 列的数据框(DF1)。(其中一列是 ID) 我还有一个包含 30 列的数据框(DF2)。(一列是 ID) 我必须用第二个数据帧 (DF2) 中的值更新数据帧 (DF1) 的前 30 列,保持第一个数据帧 (DF1) 其余列中的其余值不变。

当第一个数据框 (DF1) 中存在第二个数据框 (DF2) 中的 ID 时,更新 DF1 中 100 列中的前 30 列值。

【问题讨论】:

  • 你能举个例子吗? df2的ID的所有值都一样吗?
  • DF2中的ID值是DF1中需要更新的值。 DF2 中有具有不同 ID 值的行,需要在 DF1 中相应更新。保持 DF1 中的其余值不变。

标签: pandas python-2.7


【解决方案1】:

我在 Python 3.7 上对此进行了测试,但我认为它没有理由不能在 2.7 上运行:

joined = df1.reset_index() \
            [['index', 'ID']] \
            .merge(df2, on='ID')
df1.loc[joined['index'], df1.columns[:30]] = joined.drop(columns=['index', 'ID'])

这假设 df2 没有名为 index 的列,否则 merge 将无法说出带有后缀的重复键。

这是其内部运作的慢动作:

  1. df1.reset_index() 返回与 df1 相同的数据帧,但有一个附加列:index
  2. [['index', 'ID']] 从#1 中的数据框中提取仅包含这两列的数据框
  3. .merge(...)df2 合并,匹配 ID 。结果 (joined) 是一个包含 32 列的数据框:indexIDdf2 的原始 30 列。
  4. df1.loc[<row_indexes>, <column_names>] = <another_dataframe> 表示您想用来自another_dataframe 的数据替换那些特定的单元格。由于joined 有 32 列,我们需要删除额外的 2 列(indexID

【讨论】:

  • 你能解释一下这个sn-p的工作原理吗?提前致谢。
  • 这种方法没有给我想要的结果。这是我的代码:if row['ABAN8'] in new_result['ABAN8'].values: col_df = new_result.loc[new_result['ABAN8'].isin([row['ABAN8']])] joined = new_result.reset_index()[['index', 'ABAN8']].merge(col_df, on='ABAN8') new_result.loc[joined['index'], new_result.columns[:95]] = joined.drop(columns=['index', 'ABAN8'])
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 2019-06-30
  • 2020-07-31
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多