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)
)
我正在尝试为 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)
)