gpt4 book ai didi

python - 对具有相同名称的行进行分组的最佳方法

转载 作者:行者123 更新时间:2023-12-04 09:11:52 26 4
gpt4 key购买 nike

我有那个 df:

gene  person  allele    allele2
A1 p1 G C
A2 p1 A C
A3 p1 A T
A1 p2 G C
A2 p2 T T
A3 p2 G C
A4 p2 A T
A2 p1 G C
A3 p1 C C
...
正如你所看到的,在表中我可以有几次同一个人(来自不同实验室的记录)。第一个 p1 是第二个 p1 的不同样本,我只需要选择得分最高的唯一样本(行数最高),所以这个例子将是第一个 p1 因为它有 3,而另一个有 2。
而且我不知道如何提取该表以得到如下内容:
gene  person  allele    allele2
A1 p1 G C
A2 p1 A C
A3 p1 A T
A1 p2 G C
A2 p2 T T
A3 p2 G C
A4 p2 A T
...
我正在考虑通过 for 循环对其进行索引。例如,如果人 == 高于人,则添加到索引 i。如果没有,我+1。然后我会有一个小组。但是……整个 df 有 300 万行,所以在我开始之前,我决定在这里描述我的问题。也许这是更好的方法?

最佳答案

通过比较创建连续组 Series.ne Series.shift Series.cumsum ,然后按 Series.map 计数与 Series.value_counts :

g = df['person'].ne(df['person'].shift()).cumsum()
s = g.map(g.value_counts())

print (s)
0 3
1 3
2 3
3 4
4 4
5 4
6 4
7 2
8 2
Name: person, dtype: int64
最后比较每个 person 的最大值来自 GroupBy.transform Series s boolean indexing :
print (s.groupby(df['person']).transform('max'))
0 3
1 3
2 3
3 4
4 4
5 4
6 4
7 3
8 3
Name: person, dtype: int64

df = df[s.groupby(df['person']).transform('max').eq(s)]
print (df)
gene person allele allele2
0 A1 p1 G C
1 A2 p1 A C
2 A3 p1 A T
3 A1 p2 G C
4 A2 p2 T T
5 A3 p2 G C
6 A4 p2 A T
编辑:如果需要第一组相同的大小,例如这里群 p1具有相同的长度 2 次:
#added last row for another data test
print (df)
gene person allele allele2
0 A1 p1 G C
1 A2 p1 A C
2 A3 p1 A T
3 A1 p2 G C
4 A2 p2 T T
5 A3 p2 G C
6 A4 p2 A T
7 A2 p1 G C
8 A3 p1 C C
9 A4 p1 C C
g = df['person'].ne(df['person'].shift()).cumsum()
print (g)
0 1
1 1
2 1
3 2
4 2
5 2
6 2
7 3
8 3
9 3
Name: person, dtype: int32

#same size 3
s = g.map(g.value_counts())
print (s)
0 3
1 3
2 3
3 4
4 4
5 4
6 4
7 3
8 3
9 3
Name: person, dtype: int64
#selected first max index in s
idx = s.groupby(df['person']).idxmax()
print (idx)
person
p1 0
p2 3
Name: person, dtype: int64

#seelcted groups g
print (g.loc[idx])
0 1
3 2
Name: person, dtype: int32
#selected only matched groups
print (g.isin(g.loc[idx]))
0 True
1 True
2 True
3 True
4 True
5 True
6 True
7 False
8 False
9 False
Name: person, dtype: bool

df = df[g.isin(g.loc[idx])]
print (df)
gene person allele allele2
0 A1 p1 G C
1 A2 p1 A C
2 A3 p1 A T
3 A1 p2 G C
4 A2 p2 T T
5 A3 p2 G C
6 A4 p2 A T

关于python - 对具有相同名称的行进行分组的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63335767/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com