我的数据框由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_track记录后,我需要编辑那些在原始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_tracks中,因为总计而言,该数据集中超过40%的物种出现了停靠点,因此对于这些情况,我将有一个单独的df跟踪器(基本上停止超过跟踪整个列的百分比限制,然后将其删除)。
答案 0 :(得分:0)
似乎您正在用代码更改整行。 例如:
In[1]: df[2] == 'TGA'
Out[1]:
0 True
1 False
2 False
Name: 2, dtype: bool
您将获得一个系列。然后,如果您使用该系列进行DataFrame索引,则将获得该系列为true的所有行。
In[2]: df[df[2] == 'TGA']
Out[2]:
1 2 3 4
0 ATG TGA CCC CCC
如果使用列表进行索引,您将获得相同的结果。 简而言之,您可以使用pandas Dataframe的“替换”方法。像这样:
df = df.replace(["TAG", "TAA", "TGA"], '---')