pandas 中单列中每一行的公共值

common Value for each row in a single column in pandas

我正在尝试为 pandas 数据框中特定列的每一行查找重复值。

df = pd.DataFrame(data=[[1,['A','B','C']],[1,['C','D','F']],[1,['C','E','F']],[2,['E','G','F']],[2,['E','D','H']] ],columns=['id','tag'])

df
Out[1]: 
     id      tag
0     1   [A, B, C]
1     1   [C, D, F]
2     1   [C, E, F]
3     2   [E, G, F]
4     2   [E, D, H]

我有一个名为“标签”的列表,其中包含几个标签

Tags = ['A','B','C','D','E','F','G','H']

对于列表中的每个标签,如果标签的频率数等于id的频率数,那么标签将被赋予该id。比如id 1,tag C出现了3次3次,id 1也有3次,所以id 1匹配tag C。

有没有办法使输出看起来像下面这样?

Out[2]: 
     id      tag
0     1       C
1     2       E

要在每个组的所有列表中获得公共值,请使用 groupby aggregate 和一些 set 逻辑:

new_df = (
    df.groupby('id')['tag']
        .agg(lambda l: set.intersection(*map(set, l)))
        .reset_index()
)

new_df:

   id  tag
0   1  {C}
1   2  {E}

可选explode 展开集合:

new_df = (
    df.groupby('id')['tag']
        .agg(lambda l: set.intersection(*map(set, l)))
        .explode()
        .reset_index()
)

new_df:

   id tag
0   1   C
1   2   E

要获取 Tag 列表中具有与组大小相同的值数量的任何值,请使用:

df['size'] = df.groupby('id').transform('count')
df = df.explode('tag')
df = (
    df[df['tag'].isin(Tags)]
        .value_counts()
        .reset_index(name='count')
)
df = (
    df[df['size'].eq(df['count'])]
        .drop(['size', 'count'], axis=1)
        .reset_index(drop=True)
)
   id tag
0   1   C
1   2   E

不使用 Tags 列表进行过滤:

df['size'] = df.groupby('id').transform('count')
df = (
    df.explode('tag')
        .value_counts()
        .reset_index(name='count')
)
df = (
    df[df['size'].eq(df['count'])]
        .drop(['size', 'count'], axis=1)
        .reset_index(drop=True)
)