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

时间:2018-12-31 02:06:08

标签: python pandas dataframe

我的数据框由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跟踪器(基本上停止超过跟踪整个列的百分比限制,然后将其删除)。

1 个答案:

答案 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"], '---')