簡體   English   中英

無法從熊貓數據框中提取正確的列

[英]Unable to extract the correct columns from a pandas dataframe

我正在創建一個腳本,通過跟蹤測試數據集中的錯誤來編輯DNA序列比對。 我的目標是跟蹤包含低於和超過特定閾值的終止密碼子的列。 例如,如果一列(包含3個鹼基或一個密碼子)包含“ TAA”,“ TGA”或“ TAG”,並且如果超過40%的樣品包含該列中的那些終止密碼子,我想保留記錄在單獨的excel文件(我可以創建)中,因為這些列將被刪除。 如果少於40%的樣本在一列中包含終止密碼子,我將分別對其進行跟蹤,因為需要對其進行編輯。

我的數據框看起來像這樣(我在這里添加了“ /”只是為了更容易地在此處顯示密碼子):

    1    2  3    4 ... 1000
S1 TAA/TAA/TGA/CCC/.../TGA
S2 ATG/-AT/TAG/---/.../TGA
S3 ATG/TAA/-CC/--T/.../TAA
S4 ATG/TAA/GTA/CCC/.../TAA
S5 ATG/-AT/---/---/.../TAG
S6 ATG/TAA/-CC/--T/.../TAG
S7 ATG/TAA/GTA/CCC/.../CCC
S8 ATG/-AT/---/---/.../CCC
S9 ATG/TAA/-CC/--T/.../CCC
S10 ATG/TAA/-CC/--T/.../CCC

我可以輕松提取帶間隙的列(包含“ ---”),並且能夠跟蹤終止密碼子超過40%的列,但無法跟蹤包含少於40%的列,這是因為它正在循環3個密碼子各自獨立。 例如,如果我有10個樣本,如果第1列中少於4個樣本包含“ TAA”或“ TGA”或“ TAG”(以任何組合),我將保留該記錄,並將終止密碼更改為“ ---在最終編輯的數據框中。 但是,當每個終止密碼子出現的次數少於4次時,我的腳本將對它們進行單獨處理,並向我顯示包含超過40%終止密碼子的列,因為我無法弄清楚如何對所有三個密碼子求和。一共。

df # (loaded earlier from a large script)
df_track = pd.DataFrame() # make new df to track less than 40% stop codons in columns
codon = ["TAA","TGA","TAG"]
def track_lessthan40(df, codon, 0.4):
    num_rows = len(df)
    change = [col for col in df.columns \
        if sum(df[col] == codon[0]) > 0 or sum(df[col] == codon[1]) > 0 \
        or sum(df[col] == codon[2]) > 0 \
        and sum(df[col] == codon[0]) \
        and sum(df[col] == codon[1]) \
        and sum(df[col] == codon[2]) < round(num_rows*0.4, 2)]

df_change = df[change]
print(df_change)

我的期望:

df_change

    1  3
S1 TAA/TGA
S2 ATG/TAG
S3 ATG/-CC
S4 ATG/GTA
S5 ATG/---
S6 ATG/-CC
S7 ATG/GTA
S8 ATG/---
S9 ATG/-CC
S10 ATG/-CC

我得到什么。

    1  3  ... 1000
S1 TAA/TGA/.../TGA
S2 ATG/TAG/.../TGA
S3 ATG/-CC/.../TAA
S4 ATG/GTA/.../TAA
S5 ATG/---/.../TAG
S6 ATG/-CC/.../TAG
S7 ATG/GTA/.../CCC
S8 ATG/---/.../CCC
S9 ATG/-CC/.../CCC
S10 ATG/-CC/.../CCC

最后一列顯示,但不應該顯示。 僅當我希望在40%以上的樣本中出現終止密碼子的列時,才應在其他腳本中對其進行跟蹤。 有關如何執行此操作的任何想法? 謝謝!

IIUC df.isin(codon).sum()/len(df) <= 0.4輸出

#    1       True
#  2        False
# 3          True
#   4        True
# 1000      False

並且您可以像這樣選擇列:

df.loc[:, df.isin(codon).sum()/len(df) <= 0.4]

使用pd.isin檢查列中是否有任何終止密碼子,求和以計算其為真的次數,然后除以數據幀的長度以得到百分比。

您的示例代碼的構成與所使用的df之間可能似乎有所不同。 喬恩(Jon)稍作調整的示例和我的腳本適用於您的示例(見圖)。

在此處輸入圖片說明

# my clunky example
import pandas as pd
csv = '/Users/<USER>/PycharmProjects/stackoverflow/gattaka.text'

df = pd.read_table(csv, sep='/')

df_track = pd.DataFrame()  # make new df to track less than 40% stop codons in columns
codon = ["TAA", "TGA", "TAG"]

for column in df.columns:
    col_length = len(df[column])
    col_list = df[column].tolist()

    sum_stopper = 0
    for gene in col_list:
        if gene in codon:
            sum_stopper += 1

    if sum_stopper == 0:
        break

    elif sum_stopper <= (0.4 * col_length):
        col_series = pd.Series(col_list, name=column)
        df_track[column] = col_series

print(df_track)
print('------')

# Jon's adjusted, pretty, concise and pythonic example
df_track = df.loc[:, (df.isin(codon).sum()/len(df) <= 0.4) & (df.isin(codon).sum() > 0)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM