这看起来并不难,但还没有找到解决方案。我有一个df,看起来像这样:
df = {'Name': ['MIR-10','MIR-10','LET-7','LET-7','LET-7','MIR-142','MIR-142','MIR-142'],
'Type':['3prime','3prime','3prime','5prime','5prime','3prime','5prime','3prime']}
df = pd.DataFrame(data=df)
print(df)
Name Type
0 MIR-10 3prime
1 MIR-10 3prime
2 LET-7 3prime
3 LET-7 5prime
4 LET-7 5prime
5 MIR-142 3prime
6 MIR-142 5prime
7 MIR-142 3prime我使用groupby()计算了Name中每个元素的每个Type的频率,如下所示:
df['count'] = df.groupby(['Name','Type'])['Type'].transform('count')
print(df)
Name Type count
0 MIR-10 3prime 2
1 MIR-10 3prime 2
2 LET-7 3prime 1
3 LET-7 5prime 2
4 LET-7 5prime 2
5 MIR-142 3prime 2
6 MIR-142 5prime 1
7 MIR-142 3prime 2然后,如果count列是列Name和Type的最大值,我想要做的就是保留df。所需的输出应如下所示:
Name Type count
0 MIR-10 3prime 2
1 MIR-10 3prime 2
2 LET-7 5prime 2
3 LET-7 5prime 2
4 MIR-142 3prime 2
5 MIR-142 3prime 2我尝试了几种方法(如下所示),但无法获得目标输出。
df = df.groupby(['Name','Type'])['count'].transform(max)
print(df)提前谢谢你。
发布于 2020-11-09 03:19:44
不完全确定这是否是您要查找的内容,但我确定了每个类型的最大计数和每个名称的最大计数,如果行中的计数等于这两个最大计数,则应该保留它:
df['max_name'] = df.groupby(['Name'])['count'].transform(max)
df['max_type'] = df.groupby(['Type'])['count'].transform(max)
df.query("max_name == count and max_type == count")
Name Type count max_name max_type
0 MIR-10 3prime 2 2 2
1 MIR-10 3prime 2 2 2
3 LET-7 5prime 2 2 2
4 LET-7 5prime 2 2 2
5 MIR-142 3prime 2 2 2
7 MIR-142 3prime 2 2 2发布于 2020-11-09 03:30:53
使用GroupBy.value_counts和使用level检查max会更容易
new_df = df.join(df.groupby('Name', sort=False)['Type']
.value_counts()
.loc[lambda x: x.eq(x.max(level=0)) | x.eq(x.max(level=1))]
.rename('count'), on=['Name', 'Type'], how='right')
print(new_df)
Name Type count
0 MIR-10 3prime 2
1 MIR-10 3prime 2
3 LET-7 5prime 2
4 LET-7 5prime 2
5 MIR-142 3prime 2
7 MIR-142 3prime 2发布于 2020-11-09 08:15:20
我们可以使用assign方法创建临时列,并筛选计数等于每个组的最大计数的行:
(df.assign(count = lambda x: x.groupby(['Name','Type']).Type.transform('count'),
maximum = lambda x: x.groupby(['Name'])['count'].transform('max'),
filter_ = lambda x: x['count'].eq(x['maximum']))
.loc[lambda x: x.filter_, ['Name','Type','count']]
)
Name Type count
0 MIR-10 3prime 2
1 MIR-10 3prime 2
3 LET-7 5prime 2
4 LET-7 5prime 2
5 MIR-142 3prime 2
7 MIR-142 3prime 2https://stackoverflow.com/questions/64741869
复制相似问题