Во-первых, мы можем выполнить GroupBy/применить операцию, чтобы получить белок/пептидных пар с двумя крупнейшими Пептид рассчитывает для каждого белка:
counts = (df.groupby(['Protein'])['Peptide']
.apply(lambda x: x.value_counts().nlargest(2)))
counts = counts[counts >= 2]
counts = counts.to_frame()
# counts
# Protein Peptide
# A1 AAB 2
# ABB 2
# A2 ABB 2
# ABC 2
Теперь мы можем объединить оригинальную DataFrame, df
с counts
, путем объединения на столбцах df
и индекса counts
. Использование внутреннего соединения гарантирует, что только те, Protein/Пептидные пары, которые присутствуют в обоих df
и counts
проявляющиеся в result
:
result = pd.merge(df, counts, left_on=['Protein', 'Peptide'], right_index=True,
how='inner')
# Protein Peptide Mean intensity counts
# 0 A1 AAB 4.54 2
# 3 A1 AAB 5.67 2
# 1 A1 ABB 5.56 2
# 2 A1 ABB 4.67 2
# 5 A2 ABB 4.64 2
# 7 A2 ABB 5.56 2
# 8 A2 ABC 4.67 2
# 9 A2 ABC 5.67 2
Теперь легко выполнить нужную groupby/mean
операцию:
result = result.groupby(['Protein', 'Peptide'])['Mean intensity'].mean()
Так положить все это вместе,
import pandas as pd
df = pd.read_table('data', sep='\s{2,}')
counts = (df.groupby(['Protein'])['Peptide']
.apply(lambda x: x.value_counts().nlargest(2)))
counts = counts[counts >= 2]
counts = counts.to_frame()
result = pd.merge(df, counts, left_on=['Protein', 'Peptide'], right_index=True,
how='inner')
result = result.groupby(['Protein', 'Peptide'])['Mean intensity'].mean()
result = result.reset_index()
print(result)
дает
Protein Peptide Mean intensity
0 A1 AAB 5.105
1 A1 ABB 5.115
2 A2 ABB 5.100
3 A2 ABC 5.170
Cal вы объясните, пожалуйста, расчет, как вам добраться до желаемого результата? И что означает значение, например '4,54 + 5.67/2'? Очень дикое предположение: распределение с 4.54 как среднее и 5.67 как FWHM или '5.67/2' как стандартное отклонение? – Carsten
Нет. Я просто имел в виду, что он вычисляет для белка A1 пептид AAB (в первой таблице он имеет два значения и просто вычисляет средства этих двух значений пептида), поэтому добавление средних значений AAB и деление на сколько AAB. Среднее значение средней интенсивности для пептида. – Maku
Хорошо, получилось, но я до сих пор не понимаю, как вы получаете значение 7.42 для A2/ABB. Это опечатка? Потому что, если вам просто нужно среднее значение для каждой комбинации белка/пептида, вы можете просто называть 'df.groupby (['Protein', 'Peptide']). Mean()'. Это то, что вы хотите? – Carsten