更新数据帧中的单元格会改变整行吗?

2024-04-29 01:08:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数据框架由DNA序列组成,每列包含3个碱基,代表密码子。我的目标是在给定的条件下,将任何包含某个字符串的密码子更新为间隙。示例条件,如果我的密码子列表中的任何终止密码子出现在小于某个百分比的列中,请将这些终止密码子编辑为间隙。你知道吗

示例df:

            1   2   3   4   5   6   7   8   9   10  11  12
species1    TAG GAC AGG TTA CTA TGG TCA TAA TTC CTG CTG TAA
species2    GTG GAC AGG TTG CGG TGG TCA TGA TTG CTG CTC TAA
species3    TTG GAC AGG TTA CTA TGG TCA TGA TTG CTG CTG TGA
species4    ACC AGC AGG TTC CTG TGC TCA GTT TTG CTG CTG TGA
species5    ATG GAC GGG GTA GTA CGG TCA GTT TTG CTC CTG TAG
species6    ATG GAC GGG ATA GTA CGG TCA GTG TTG CTC CTG TAG
species7    ATG GAC GGG ATA GTA CGG TCA GTT TTG CTC CTG CTG
species8    ATG GAC AGG TTA CGG TGG TCA GTT TTG CTG CTG CTG
species9    TTG GAC AGG TTA CTC TGG TCA GTG TTG CTG CTG CTG
species10   CCC GAC TAA C-C GTG GGT TGA TGG TTG CTG CTG CTG

我的脚本首先跟踪具有<;40%停止的列:

codon = ["TAG", "TAA", "TGA"]
df_track = df.loc[:, (df.isin(codon).sum()/len(df) <= frac1) & (df.isin(codon).sum() > 0)]
print(df_track)

            1   3   7   8   
species1    TAG AGG TCA TAA 
species2    GTG AGG TCA TGA 
species3    TTG AGG TCA TGA 
species4    ACC AGG TCA GTT 
species5    ATG GGG TCA GTT 
species6    ATG GGG TCA GTG 
species7    ATG GGG TCA GTT 
species8    ATG AGG TCA GTT 
species9    TTG AGG TCA GTG 
species10   CCC TAA TGA TGG 

然后,在保持df_跟踪记录之后,我需要编辑那些出现在原始df中的站<;40%:

for col in df.columns:
    if df.loc[:, (df.isin(codon).sum()/len(df) <= 0.4) & (df.isin(codon).sum() > 0)]:
        df[df[col] ==  (cod for cod in codon), col] = "---"
print(df)

这会发出警告:

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

编辑停止后我所期望的:

            1   2   3   4   5   6   7   8   9   10  11  12
species1    --- GAC AGG TTA CTA TGG TCA --- TTC CTG CTG TAA
species2    GTG GAC AGG TTG CGG TGG TCA --- TTG CTG CTC TAA
species3    TTG GAC AGG TTA CTA TGG TCA --- TTG CTG CTG TGA
species4    ACC AGC AGG TTC CTG TGC TCA GTT TTG CTG CTG TGA
species5    ATG GAC GGG GTA GTA CGG TCA GTT TTG CTC CTG TAG
species6    ATG GAC GGG ATA GTA CGG TCA GTG TTG CTC CTG TAG
species7    ATG GAC GGG ATA GTA CGG TCA GTT TTG CTC CTG CTG
species8    ATG GAC AGG TTA CGG TGG TCA GTT TTG CTG CTG CTG
species9    TTG GAC AGG TTA CTC TGG TCA GTG TTG CTG CTG CTG
species10   CCC GAC --- C-C GTG GGT --- TGG TTG CTG CTG CTG

请注意,第12列不会被编辑或出现在df\u轨迹中,因为总的来说,停止出现在这个数据集中超过40%的物种中,因此对于这些情况,我会有一个单独的df跟踪器(基本上,如果停止超过跟踪整个列的百分比限制,然后删除)。你知道吗


Tags: dfaggatggttctcgggtggctg
1条回答
网友
1楼 · 发布于 2024-04-29 01:08:47

似乎您正在用代码更改整行。 例如:

In[1]: df[2] == 'TGA'
Out[1]: 
0     True
1    False
2    False
Name: 2, dtype: bool

你会得到一个系列。然后,如果您使用这个序列来做数据帧索引,您将得到序列为真的所有行。你知道吗

In[2]: df[df[2] == 'TGA']
Out[2]: 
     1    2    3    4
0  ATG  TGA  CCC  CCC

如果你用列表索引,你会得到同样的结果。 简而言之,您可以使用Dataframe的“replace”方法。像这样:

df = df.replace(["TAG", "TAA", "TGA"], ' -')

相关问题 更多 >