gpt4 book ai didi

python - 保留 pandas groupby 中的干扰列

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

我有一个中等大小的数据集,正在用 pandas 处理。它有大约 600,000 行。

它具有三个“id”变量:“gene_id”、“gene_name”和“transcript_id”,以及一些在运行时确定的数字列。

In [129]: df.head().todict()
{u'utr3_count': {8: 2.0, 30: 1.0, 29: 2.0, 6: 2.0, 7: 2.0},
u'gene_id': {8: u'ENSG00000188157', 30: u'ENSG00000160087', 29: u'ENSG00000176022', 6: u'ENSG00000188157', 7: u'ENSG00000188157'},
u'utr3_enrichment': {8: 2.1449912126499999, 30: 1.14988290398, 29: 1.0484234234200001, 6: 2.1449912126499999, 7: 2.1449912126499999},
u'transcript_id': {8: u'ENST00000379370', 30: u'ENST00000450390', 29: u'ENST00000379198', 6: u'ENST00000379370', 7: u'ENST00000379370'},
u'expression': {8: 0.13387876534027521, 30: 0.514855687606112, 29: 0.79126387397064091, 6: 0.13387876534027521, 7: 0.13387876534027521},
u'gene_name': {8: u'AGRN', 30: u'UBE2J2', 29: u'B3GALT6', 6: u'AGRN', 7: u'AGRN'}}

我想获取每个“transcript_id”的重复次数的平均值。但是通过对“transcript_id”进行分组意味着我会丢失有关“gene_id”和“gene_name”的信息,因为它们被归类为滋扰列。

如果我对所有三列进行分组,即使在一个大盒子(128GB)上,我也会立即得到 MemoryError,因为 pandas 尝试对三列中的值的每个组合进行计算,即使这绝对不是必要的:每个“transcript_id”映射到一个“gene_id”和一个“gene_name”。

有没有办法只对transcript_id进行分组而不丢失其他列中的信息?

最佳答案

简单的解决方案:

商店transcript_id , gene_idgene_name在单独的 DataFrame 中(例如 metadata ):

metadata = df[['transcript_id', 'gene_id', 'gene_name']].copy()
# .copy() is important!

groupbytranscript_id就像您现在所做的那样,并执行计算(例如 agg_df )。完成后,将两个框架合并在一起:

pd.merge(agg_df, metadata, how='left', on='transcript_id)

这之所以有效,是因为

... each "transcript_id" maps to a single "gene_id" and a single "gene_name"

<小时/>

替代解决方案:

使用 pd.read_csv(file_path, chunksize = <some integer, say 5e4>) 分块读取文件(假设您正在从 csv 中读取) 。 groupby在所有三列上(您现在不会遇到MemoryError,因为您只读取部分数据)并保持运行总计和运行计数。将总数除以最后的计数。伪代码:

totals = pd.DataFrame()
counts = pd.DataFrame()
df = pd.read_csv(file_path, chunksize=5e4)
for chunk in df:
grouped = chunk.groupby(['transcript_id', 'gene_id', 'gene_name'])
totals = totals.add(grouped.sum())
counts = counts.add(grouped.count())
means = totals/counts

只要您需要一些可以逐个计算的度量,例如总和、计数、乘积、累积和和乘积,这就可以工作。但任何像百分位数或

<小时/>

另一种解决方案(稍难):合并列 transcript_id , gene_idgene_name在另一列中,例如 merged_idgroupbymerged_id 。在计算结束时将该列拆分为多个组件。

<小时/>

诗。我建议使用简单解决方案。

关于python - 保留 pandas groupby 中的干扰列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33900267/

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