2017-07-10 5 views
1

私は多くの列を持つかなり大きなパンダのデータフレームを持っています。データフレームには2つのグループがあります。パンダのデータフレームでグループ別にt検定するには?

import pandas as pd 
csv = [{"air" : 0.47,"co2" : 0.43 , "Group" : 1}, {"air" : 0.77,"co2" : 0.13 , "Group" : 1}, {"air" : 0.17,"co2" : 0.93 , "Group" : 2} ] 
df = pd.DataFrame(csv) 

は、私は、それによって二つのグループGroup = 1Group = 2比較airco2にt検定t検定を実行する次のようにそれは基本的に設定されています。

airco2よりも多くの列があります。したがって、データフレーム内のすべての列に対して機能するプロシージャを探したいと思います。私は、scipy.stats.ttest_relと一緒にpd.groupby oder applyと一緒に使うことができると信じています。それはどのように機能しますか?事前に感謝/ R

答えて

1

私はpandas dataframe.whereメソッドを使用します。コードの

group1_air = df.where(df.Group== 1).dropna()['air'] 
group2_air = df.where(df.Group== 2).dropna()['air'] 

このビットはgroup1_airにグループ列が1である空気のコラムのすべての値およびグループはgroup2_air 2である空気のすべての値を返します。 メソッドは、指定された条件が満たされないすべての行に対してNANを返すため、drop.na()が必要です。したがって、df.where(df.Group== 1)を使用すると、groupが2のすべての行がNAN値を返します。

scipy.stats.ttest_relまたはを使用する必要があるかどうかは、グループによって異なります。サンプルが独立したグループからのものである場合は、ttest_relを使用する必要があるサンプルが関連グループのものである場合は、ttest_indを使用する必要があります。

あなたのサンプルが他と独立している場合は、必要なコードの最後の部分があります。あなたはまた、あなたは、単に与えられた例では、CO2のための空気を変更する必要がCO2をテストしたい場合は

scipy.stats.ttest_rel(group1_air,group2_air) 

を使用する必要がある他の

scipy.stats.ttest_ind(group1_air,group2_air) 

編集:

これは、あなたがグループ列を除いて、あなたのデータフレーム内のすべてのカラムにttestsを実行するために実行する必要があり、コードのラフスケッチです。 column_listでビットを改ざんして、必要に完全に準拠させる必要があります(たとえば、すべての列をループしたくない場合があります)。このコードの終わりに

# get a list of all columns in the dataframe without the Group column 
column_list = [x for x in df.columns if x != 'Group'] 
# create an empty dictionary 
t_test_results = {} 
# loop over column_list and execute code explained above 
for column in column_list: 
    group1 = df.where(df.Group== 1).dropna()[column] 
    group2 = df.where(df.Group== 2).dropna()[column] 
    # add the output to the dictionary 
    t_test_results[column] = scipy.stats.ttest_ind(group1,group2) 
results_df = pd.DataFrame.from_dict(t_test_results,orient='Index') 
results_df.columns = ['statistic','pvalue'] 

あなたがオーバーループしているだろう、すべてのカラムでのt検定の出力を持つデータフレームを持っています。

+0

これは1つ1つの場合の非常に良い答えです。しかし、私は 'air'と' co2'のために試してみたいと思っています。どのようにそれが起こるようにするか? – Rachel

+1

@レイチェル私は答えを編集して大文字と小文字を区別しませんでした。 – error

関連する問題