【问题标题】:Python Pandas match dataframesPython Pandas 匹配数据框
【发布时间】:2017-05-25 19:11:37
【问题描述】:

例如,我有 3 个不同的数据框,每个数据框都有不同的列,除了所有 3 个数据框中存在的具有相同标题的一列。 在本专栏中,我有例如名称,我想计算一个名称在不同数据框中重复的次数。

例如,这些是 3 个数据框:

df1:

col1   col2   names   col3
 a       a     bbb      a
 a       a     ccc      a
 a       a     bbb      a

df2:

col4   col5   names   col6
 a       a     bbb      a
 a       a     zzz      a
 a       a     qqq      a

df3:

col7   col8   names   col9
 a       a     zzz      a
 a       a     zzz      a
 a       a     rrr      a

所以输出数据框将是:

names    df1    df2    df3   total
 bbb      V      V      X      2
 ccc      V      X      X      1
 zzz      X      V      V      2
 qqq      X      V      X      1
 rrr      X      X      V      1

所以输出数据框检查哪个名称存在于任何其他 df 中,最后一列计算它出现的次数。

pandas 有没有一种简单的方法来进行这种搜索和计数,还是我必须将其切换到列表中并开始遍历列表?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    你可以使用concat + get_dummies + groupby + reset_index + max + T + sum + replace

    dfs = [df1, df2, df3]
    names = ['df1', 'df2', 'df3']
    df = pd.concat([df['names'] for df in dfs], keys=names)
    df = pd.get_dummies(df.reset_index(level=1, drop=True)).groupby(level=0).max().T
    df['total'] = df.sum(axis=1)
    df[names] = df[names].replace({0:'X', 1:'V'})
    print (df)
        df1 df2 df3  total
    bbb   V   V   X      2
    ccc   V   X   X      1
    qqq   X   V   X      1
    rrr   X   X   V      1
    zzz   X   V   V      2
    

    【讨论】:

    • 虽然有一个问题,但效果很好:首先,例如,我如何过滤和隐藏“总”小于 2 的行?
    • 很高兴能帮上忙!。隐藏是什么意思?删除行?替换为 NaN?
    • 删除行
    • 然后使用boolean indexing - df1 = df[df['total'] >= 2] - 需要inverse条件 -> <2 to >=2
    • 或使用query - df1 = df.query('total >= 2')
    猜你喜欢
    • 1970-01-01
    • 2017-06-23
    • 2021-10-22
    • 2021-07-22
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 2019-01-04
    相关资源
    最近更新 更多