2016-12-13 8 views
2

でユニークな値を持つデータフレームの列を変換:私はM1、M2、M3の平均Mと価値のLogRatioをCalculがする新しい列を追加したい私は、次のデータフレーム持っているパンダ

datas = [['RAC1','CD0287',1.52,1.40,1.45,1.51], ['RAC1','CD0695',2.08,1.40,1.45,1.51], ['RAC1','ADN103-1',2.01,1.40,1.45,1.51], ['RAC3','CD0258',1.91,1.38,1.43,1.45], ['RAC3','ADN103-3',1.66,1.38,1.43,1.45], ['RAC8','CD0558',1.32,1.42,1.48,1.53], ['RAC8','ADN103-8',2.89,1.42,1.48,1.53]] 
labels = ['Plate', 'Sample', 'LogRatio', 'm1', 'm2', 'm3'] 
df = pd.DataFrame(data = datas, columns=labels) 

Plate Sample LogRatio m1 m2 m3  
RAC1 CD0287 1.52  1.40 1.45 1.51 
RAC1 CD0695 2.08  1.40 1.45 1.51 
RAC1 ADN103-1 2.01  1.40 1.45 1.51 
RAC3 CD0258 1.91  1.38 1.43 1.45 
RAC3 ADN103-3 1.66  1.38 1.43 1.45 
RAC8 CD0558 1.32  1.42 1.48 1.53 
RAC8 ADN103-8 2.89  1.42 1.48 1.53 

をADN103しかし、私は値をプレートで追加する方法を知らない。私が欲しいもの がある:私のデータフレームの最初の行のための例えば

df['M'] = (df['m1'] + df['m2'] + df['m3'] + LogRatio_ADN103_of_the_plate)/4 

、Calculがは次のとおりです。

df['M'] = (1.40 + 1.45 + 1.51 + 2.01)/4 

Plate Sample LogRatio m1 m2 m3  M  
RAC1 CD0287 1.52  1.40 1.45 1.51 1,5925 
RAC1 CD0695 2.08  1.40 1.45 1.51 
RAC1 ADN103-1 2.01  1.40 1.45 1.51 
RAC3 CD0258 1.91  1.38 1.43 1.45 
RAC3 ADN103-3 1.66  1.38 1.43 1.45 
RAC8 CD0558 1.32  1.42 1.48 1.53 
RAC8 ADN103-8 2.89  1.42 1.48 1.53 

2.01は、プレートRAC1にADN103のLogRatio値ですので。 私はすべてのプレートのためのADN103値を取得する方法を知っている:

expreg = "ADN103_RAC." 
ADN103 = df[df['Sample'].str.contains(expreg, regex=True)] 
logRatio_ADN103 = ADN103['Log Ratio'] 

私はADN103値を選択して、新規の列に変換を試みたが、私は彼らのLogRatio値を得ることができない、それだけでブール

をretrun
df['ADN103oftheplate'] = df.groupby('Plate')['Sample'].transform(lambda x: x.str.contains(expreg, regex=True)) 

明らかかどうかわかりません。私はいろいろなやり方を試みて、今は完全に失われています。

ありがとうございました。

+0

あなたは、元のデータフレームを作成する実際のコードが含まれている場合、それは数字だけをコピーして貼り付けるよりも良いだろう。それは他の人がより簡単に作業できるようにします。 – Alex

+0

私のデータフレームは実際に私が読んだCSVファイルから来ていて、それは小さいものではありませんが、私の例では同じデータフレームを持つコードを作成しました。アドバイスをいただきありがとうございます。 – Elysire

答えて

2

異なる列の性質について考えてみましょう。この場合、 "Plate"と "Sample"の列は実際にはインデックス情報に似ています。 「プレート」インデックス内のユニークな値を超える

import pandas as pd 
import numpy as np 

datas = [['RAC1','CD0287',1.52,1.40,1.45,1.51], ['RAC1','CD0695',2.08,1.40,1.45,1.51], ['RAC1','ADN103-1',2.01,1.40,1.45,1.51], ['RAC3','CD0258',1.91,1.38,1.43,1.45], ['RAC3','ADN103-3',1.66,1.38,1.43,1.45], ['RAC8','CD0558',1.32,1.42,1.48,1.53], ['RAC8','ADN103-8',2.89,1.42,1.48,1.53]] 
labels = ['Plate', 'Sample', 'LogRatio', 'm1', 'm2', 'm3'] 
df = pd.DataFrame(data = datas, columns=labels) 

df.set_index('Plate', inplace=True) 

次にあなたがすることができますループと新に適切なLog_Valueを割り当てる:だから最初に私はそれが簡単にデータフレームをスライスして作るためにインデックスに列を「プレート」になっデータフレームのそのストレッチのための列。

for plate in df.index.unique(): 
    indx = np.where(df.loc[plate, 'Sample'].str.contains('ADN'))[0][0] 
    temp_value = df.loc[plate, 'LogRatio'].iat[indx] 
    df.loc[plate, 'ADN_LogValues'] = temp_value 

次に、最後の4つの列を合計し、4で除算します。

df['M'] = df.loc[:, 'm1':'ADN_LogValues'].sum(axis=1)/4.0 

これが生成します。

  Sample LogRatio m1 m2 m3 ADN_LogValues  M 
Plate 
RAC1  CD0287  1.52 1.40 1.45 1.51   2.01 1.5925 
RAC1  CD0695  2.08 1.40 1.45 1.51   2.01 1.5925 
RAC1 ADN103-1  2.01 1.40 1.45 1.51   2.01 1.5925 
RAC3  CD0258  1.91 1.38 1.43 1.45   1.66 1.4800 
RAC3 ADN103-3  1.66 1.38 1.43 1.45   1.66 1.4800 
RAC8  CD0558  1.32 1.42 1.48 1.53   2.89 1.8300 
RAC8 ADN103-8  2.89 1.42 1.48 1.53   2.89 1.8300 
+0

ありがとうございます。 M列を追加すると元のインデックスのデータフレームを元に戻すことは可能ですか? – Elysire

+1

確かに、これを最後に追加してください:df.reset_index(inplace = True) この質問の受け入れられた答えは、それを行う方法のより完全な説明です:http://stackoverflow.com/questions/20461165/how-変換からパンダへのデータフレームからインデックスへのインデックス – Alex

関連する問題