Обновление ячеек в панде dataframe меняет всю строку вместо? - PullRequest
0 голосов
/ 31 декабря 2018

Мой информационный кадр состоит из последовательностей ДНК, где каждый столбец содержит 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% остановками: </p>

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 для записей, мне нужно отредактировать те остановки, которые появляются <40% в исходном df: </p>

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 голосов
/ 31 декабря 2018

Кажется, что вы меняете всю строку своим кодом.Например:

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

Вы получите серию.Затем, если вы используете эту серию для индексации DataFrame, вы получите все строки, в которых эта серия истинна.

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

Если вы используете list для индексации, вы получите тот же результат.Вкратце, вы можете использовать метод замены панд Dataframe.Как это:

df = df.replace(["TAG", "TAA", "TGA"], '---')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...