簡體   English   中英

熊貓:從一行中選擇多列

[英]Pandas: selecting multiple columns from one row

我有一個腳本可以為我做事,但是效率很低。 我向代碼審查員尋求幫助,並被告知嘗試使用Pandas。 這是我所做的,但是我在理解其工作方式方面遇到了一些困難。 我已經嘗試在此處閱讀文檔和其他問題,但是找不到任何答案。

因此,我有一個數據框,其中包含少量的行(20到幾百個)和較少的列數。 我已經使用過read_table pandas函數以.txt格式獲取原始數據,如下所示:

[ID1, Gene1, Sequence1, Ratio1, Ratio2, Ratio3]
[ID1, Gene1, Sequence2, Ratio1, Ratio2, Ratio3]
[ID2, Gene2, Sequence3, Ratio1, Ratio2, Ratio3]
[ID2, Gene3, Sequence4, Ratio1, Ratio2, Ratio3]
[ID3, Gene3, Sequence5, Ratio1, Ratio2, Ratio3]

...以及一大堆不重要的列。

我想要做的是從每個序列中選擇所有比率,並對它們進行一些計算和統計(也就是說,每個序列都具有3個比率)。 我試過了

df.groupby('Sequence')
for col in df:
    do something / print(col) / print(col[0])

...但這只會讓我更加困惑。 如果我通過print(col),我會得到某種df構造的打印,而如果我通過print(col [0]),我只會得到序列。 據我在構造中看到的那樣,我仍然應該擁有所有其他列及其數據,因為groupby()不會刪除任何數據,而是僅按某個輸入列對其進行分組。 我究竟做錯了什么?

盡管我還沒走那么遠,但由於上述問題,我也希望我的腳本能夠為每個ID選擇所有比率並對它們進行相同的計算,但是這次是每個比率本身(即Ratio1對於ID1的所有行,對於Ratio2等,等等。 最后,對每個基因都做同樣的事情。

編輯:

因此,假設我要對行中的每個比率執行此計算,然后取三個結果值的中位數:

df[Value1] = spike[data['ID']] / float(data['Ratio 1]) * (10**-12) * (6.022*10**23) / (1*10**6)
df[Value2] = spike[data['ID']] / float(data['Ratio 2]) * (10**-12) * (6.022*10**23) / (1*10**6)
df[Value3] = spike[data['ID']] / float(data['Ratio 3]) * (10**-12) * (6.022*10**23) / (1*10**6)

...其中穗是字典,鍵是ID。 忽略字典部分,我可以進行計算(謝謝!),但是如何使用數據框ID訪問字典? 使用上面的代碼,我僅收到“ Unhashable type:Series”錯誤。

這是一些真實數據:

ID  Gene    Sequence    Ratio1  Ratio2  Ratio3
1   KRAS    SFEDXXYR    15.822  14.119  14.488
2   KRAS    VEDAXXXLVR  9.8455  8.9279  16.911
3   ELK4    IEXXXCESLNK 15.745  7.9122  9.5966
3   ELK4    IEGXXXSLNKR 1.177   NaN     12.073
  1. df.groupby()不會在原位置修改/分組df 因此,您必須將結果分配給新變量才能進一步使用它。 例如:

     grouped = df.groupby('Sequence') 

    順便說一句,在您提供的示例數據中,“ Sequence列中的所有數據都是唯一的,因此對該列進行分組不會有太大作用。
    此外,您通常不需要像在此那樣“遍歷df”。 要將功能應用於所有組,可以直接在groupby結果上執行此操作,例如df.groupby().apply(..)df.groupby().aggregate(..)

  2. 您能否舉一個更具體的例子說明要對比率應用哪種功能?

    要計算每個序列(每一行)的三個比率的中位數,您可以執行以下操作:

     df[['Ratio1', 'Ratio2', 'Ratio3']].median(axis=1) 

    axis=1表示您不希望獲取一列(行中)的中位數,而是獲取每一行(列中)的中位數

另一個示例,要計算每個ID的所有Ratio1的中位數,您可以執行以下操作:

df.groupby('ID')['Ratio1'].median()

在這里,您可以按ID分組,選擇列Ratio1並計算每組的中位數。


更新:您可能應該將問題分解為單獨的問題,但作為對新問題的解答:

data['ID']將為您提供ID列,因此您不能將其用作鍵。 您需要該列的一個特定值。 要將功能應用於數據框的每一行,可以使用apply

def my_func(row):
    return spike[row['ID']] / float(row['Ratio 1']) * (10**-12) * (6.022*10**23) / (1*10**6)

df['Value1'] = df.apply(my_func, axis=1)

暫無
暫無

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

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