【问题标题】:Pandas - Compare values of multiple dataframes, and keep the majority valuePandas - 比较多个数据帧的值,并保持多数值
【发布时间】:2022-07-20 00:44:51
【问题描述】:

我有 3 个包含几列的数据框(下面提供了示例)。

我想比较所有 3 个数据帧中每个单元格的值。如果超过 2 个数据框具有相同的条目,我想保留该条目。如果没有多数意见,我希望条目改为“no_majority”

以下是示例:

df_1 = pd.DataFrame({"item": {0: "banana", 1: "orange", 2: "apple"},
                     "value": {0: "label1", 1: "label6", 2: "label1"}})

df_2 = pd.DataFrame({"item": {0: "banana", 1: "orange", 2: "apple"},
                     "value": {0: "label2", 1: "label5", 2: "label1"}})

df_3 = pd.DataFrame({"fruit": {0: "banana", 1: "orange", 2: "apple"},
                     "value": {0: "label1", 1: "label4", 2: "label1"}})

以及预期的输出:

expected_out = pd.DataFrame({"fruit": {0: "banana", 1: "orange", 2: "apple"},
                     "value": {0: "label1", 1: "no_majority", 2: "label1"}})

expected_out

我该怎么做?除了索引和item 列之外,我希望在所有 3 个数据帧中比较每个观察结果。

谢谢!

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

您可以concat all dataframe 然后groupby 并检查每个组中value 列的mode()

df = pd.concat([df_1, df_2, df_3.rename(columns={'fruit': 'item'})], ignore_index=True)
out = (df.groupby('item')
       .apply(lambda g: 'no_majority' if len(g['value'].mode()) == 3 else g['value'].mode().item())
       .to_frame('value').reset_index()
       .rename(columns={'item': 'fruit'}))
print(out)

    fruit        value
0   apple       label1
1  banana       label1
2  orange  no_majority

【讨论】:

    猜你喜欢
    • 2022-11-10
    • 1970-01-01
    • 2017-06-12
    • 2021-11-14
    • 2012-09-16
    • 2016-10-15
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多