[英]Selecting the value in a row closest to zero in a pandas DataFrame with multiple columns
[英]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
df.groupby()
不會在原位置修改/分組df
。 因此,您必須將結果分配給新變量才能進一步使用它。 例如:
grouped = df.groupby('Sequence')
順便說一句,在您提供的示例數據中,“ Sequence
列中的所有數據都是唯一的,因此對該列進行分組不會有太大作用。
此外,您通常不需要像在此那樣“遍歷df”。 要將功能應用於所有組,可以直接在groupby結果上執行此操作,例如df.groupby().apply(..)
或df.groupby().aggregate(..)
。
您能否舉一個更具體的例子說明要對比率應用哪種功能?
要計算每個序列(每一行)的三個比率的中位數,您可以執行以下操作:
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.