gpt4 book ai didi

python - pandas - 从 df 中提取多个重复项到另一个

转载 作者:太空宇宙 更新时间:2023-11-03 23:55:19 25 4
gpt4 key购买 nike

东风:

geneName   HumanNumber
AHHD 585447
GDFGRE 585447
HFHFR 585447
REWEGD 585447
FDSDD 585447
AHHD 42334
GHRG 42334
REWEGD 42334
FDSDD 42334
...
HFHFR 585447
GDFGRE 585447
AHHD 585447
REWEGD 585447
FDSDD 585447
...

HumanNumber 是一个HumanID,geneName 是一个checked gene。在数据框中,我有 80k 人。每个人可以有120-200个被检查的基因。

如您所见,一个人可以被检查 2 次或更多次。在这个例子中,我在两个不同的机构检查了两次 humanID 585447。所以它需要作为两个不同的人进行分析,但我不能只更改 HumanNumber - 因为它需要与源文件相同以便以后处理。

所以我需要为所有样本创建分析。重复的不能在同一个结果文件中。他们需要分开。

所以我的想法是: - 为 DF 循环的每个 HumanNumber 添加新列 - indicationCol。 - 然后 df 将看起来:

geneName   HumanNumber   indicationCol   
AHHD 585447 1
GDFGRE 585447 1
HFHFR 585447 1
REWEGD 585447 1
FDSDD 585447 1
AHHD 42334 2
GHRG 42334 2
REWEGD 42334 2
FDSDD 42334 2
...
HFHFR 585447 3
GDFGRE 585447 3
AHHD 585447 3
REWEGD 585447 3
FDSDD 585447 3
...

现在我只能通过 ID 提取 HumanNumbers,如果 df 不是唯一的,则可以通过 indicationCol 提取相同的第二个并将其扔给另一个 df。

df

geneName   HumanNumber   indicationCol   
AHHD 585447 1
GDFGRE 585447 1
HFHFR 585447 1
REWEGD 585447 1
FDSDD 585447 1
AHHD 42334 2
GHRG 42334 2
REWEGD 42334 2
FDSDD 42334 2
...

df_duplicates:

HFHFR       585447            3
GDFGRE 585447 3
AHHD 585447 3
REWEGD 585447 3
FDSDD 585447 3

所以我写了一段代码:

name = '585447'
a = 0
df['indicationCol'] = 99999999
df= df.copy()
for i in range(len(df)):
if df[4].iloc[i] == name:
df['indicationCol'].iloc[i] = a
else:
a = a+1
name = df[4].iloc[i]
df['wskaznik'].iloc[i] = a

它确实有效(尽管我收到了来自 pandas 的复制警告),但它花费的时间太长了。 20 分钟后 i == 3263。整个 df 有 15,012,022 行。

所以..我该怎么做才能升级我的代码。我希望有更好的方法来处理这个问题,我只是不知道。

有人可以帮助我吗?

最佳答案

如果你想要这种指示重复项的时间顺序方式,我们可以使用 diffcumsum:

df['indicationCol'] = df['HumanNumber'].diff().fillna(0).ne(0).cumsum().add(1)

或者用cumsumshift:

df['indicationCol'] = df['HumanNumber'].ne(df['HumanNumber'].shift()).cumsum()

输出

   geneName  HumanNumber  indicationCol
0 AHHD 585447 1
1 GDFGRE 585447 1
2 HFHFR 585447 1
3 REWEGD 585447 1
4 FDSDD 585447 1
5 AHHD 42334 2
6 GHRG 42334 2
7 REWEGD 42334 2
8 FDSDD 42334 2
9 HFHFR 585447 3
10 GDFGRE 585447 3
11 AHHD 585447 3
12 REWEGD 585447 3
13 FDSDD 585447 3

我建议使用 HumanNumber 上的 GroupBy 和我们的新列 indicationCol 访问每个独特的组:

for _, grp in df.groupby(['HumanNumber', 'indicationCol'], sort=False):
print(grp, '\n')

geneName HumanNumber indicationCol
0 AHHD 585447 1
1 GDFGRE 585447 1
2 HFHFR 585447 1
3 REWEGD 585447 1
4 FDSDD 585447 1

geneName HumanNumber indicationCol
5 AHHD 42334 2
6 GHRG 42334 2
7 REWEGD 42334 2
8 FDSDD 42334 2

geneName HumanNumber indicationCol
9 HFHFR 585447 3
10 GDFGRE 585447 3
11 AHHD 585447 3
12 REWEGD 585447 3
13 FDSDD 585447 3

关于python - pandas - 从 df 中提取多个重复项到另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57922816/

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