【问题标题】:How to join two rows that have the same keys and complementary values如何连接具有相同键和互补值的两行
【发布时间】:2020-05-03 13:24:12
【问题描述】:

我的目标是将下表折叠成一列,这个问题专门处理下面的蓝色行。该表有 3 个分类变量和 6 个分析/定量变量。列 C1 和 C2 是唯一需要匹配才能成功连接的变量。所有空白单元格都是 NaN,下面是用于复制的 python 代码。这些行是独立导出的,因为它们具有在其他相关表中找到的信息,而不是包含在导出中。

问题。 (蓝色)蓝色行中的一些定量信息也在灰色行中,有些不是。有没有办法将新信息(Q6 中的 -8)复制到灰色行,然后删除/突出显示蓝色行?此处,假设 drop_duplicates 的 keep='first' 默认值处于活动状态,则保留灰色行分类信息。

相关问题。(黄色行)How to delete rows that are not exact duplicates but contain no new information (more NaN)

数据表


预期输出

预期输出将使用蓝色行中的 Q6 更新灰色行,并移除蓝色行。

[['C1 (PK)', 'C2 (FK)', 'C3', 'C4', 'Q1', 'Q2', 'Q3', 'Q4', 'Q5', 'Q6']
['S1','P3','H1',Timestamp('2004-12-04 00:00:00'),-15.0,-27.4,nan,-10.0,-15.0,-8]]

目前进展

我当前的代码包括这一行以删除所有定量变量均为 NaN 的所有行。
df.dropna(subset=df.columns[4:],how='all', inplace=True)

此外,此行用于删除所有定量变量相同的所有行。
df.drop_duplicates(subset=df.columns[4:], inplace=True)

可以复制到 IDE 中的示例代码。

import pandas as pd

df = [['S1','P3','H1',Timestamp('2004-12-04 00:00:00'),-15.0,-27.4,nan,-10.0,-15.0,nan],
 ['S1','P3','H1',Timestamp('2004-12-20 00:00:00'),nan,nan,nan,nan,nan,nan],
 ['S1','P3','H2',Timestamp('2004-12-20 00:00:00'),-15.0,nan,nan,-10.0,nan,nan],
 ['S1','P3','H3',Timestamp('2004-12-07 00:00:00'),nan,nan,nan,nan,-15.0,-8.0],
 ['S1','P3','H1', Timestamp('2004-12-04 00:00:00'), -15.0,-27.4,nan,-10.0, -15.0, nan]]
cols = ['C1 (PK)', 'C2 (FK)', 'C3', 'C4', 'Q1', 'Q2', 'Q3', 'Q4', 'Q5', 'Q6']
pd.DataFrame(data=df,columns=cols)

df.drop_duplicates(inplace=True)
df.dropna(subset=df.columns[4:],how='all', inplace=True)
df.drop_duplicates(subset=df.columns[4:], inplace=True)

【问题讨论】:

  • 如果匹配只需要 C1 和 C2,我不清楚为什么这个输入不会折叠成单行,或者为什么只有第 4 行会被删除。跨度>
  • 你能发布你的预期输出吗?
  • @ALollz,我已经更新了这个问题。这篇 SO 帖子专门针对蓝色列提出的问题。由于不属于导出的其他链接表中的信息,某些行是独立导出的。
  • 我明白,只是没有任何关于如何选择蓝色和灰色行的信息,唯一的选择是硬编码你正在用缺失的第 3 行更新第 0 行,然后丢弃第三个。
  • @ALollz 问题已更新。保留灰色行分类信息是因为我假设 pd.drop_duplicates 的 keep='first' 默认值。

标签: python pandas join merge drop-duplicates


【解决方案1】:

分类列的拆分:

df_categorical = df[['C1 (PK)', 'C2 (FK)',"C3", "C4"]]

对前 2 列执行 groupby 并选择要保留的第一个元素:

df_categorical = df_categorical.groupby(["C1 (PK)", "C2 (FK)"]).first()

对于定量列,再次使用 groupby,这次使用 mean:

df_quantitative = df.groupby(['C1 (PK)', 'C2 (FK)']).mean()

合并两个数据框得到结果

df_final = pd.concat([df_quantitative, df_categorical], axis=1)

重置索引

df_final.reset_index(inplace=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 2014-07-17
    • 2017-09-25
    • 2022-01-18
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多