データセット、例えば3つの特性からなる5回分の試験データがあったとして、5回分の試験データを重複なしで組み合わせて平均をとるなりの処理をしたいときの方法をメモします。
まず、サンプルデータを作ります。乱数で5行3列を作成しています。random.seedを設定することで、毎回同じ乱数になります。
import numpy as np
import pandas as pd
np.random.seed(seed=1)
df = pd.DataFrame(np.random.rand(5, 3),
columns=['sy', 'su', 'elong'],
index=['a', 'b', 'c', 'd', 'e'])
dfの中身はつぎのようになります。
sy su el
a 0.131750 0.469233 0.032909
b 0.433968 0.014887 0.557556
c 0.611954 0.148562 0.172844
d 0.166242 0.230893 0.703038
e 0.965665 0.492269 0.537133
a〜eの5行を重複なしで組み合わせる、すなわち、5つの中から2つ取り出す場合、5つの中から3つ取り出す場合、5つの中から4つ取り出す場合、5つの中から5つ取り出す場合のすべてに対して何らかの計算をしたい場合には、itertoolsのcombinationsを使うと上手く行きました。
import itertools
n = len(df)
combinations = []
for i in range(2, n+1):
combinations += list(itertools.combinations(df.T, i))
これで、combinationsはデータフレームの列のidの組合せのタプルになります。df.Tとして転地しておくことで、もとの行、すなわち試験データセットの組合せとなります。combinationsの中身はつぎのようになります。
[('a', 'b'), ('a', 'c'), ('a', 'd'), ('a', 'e'), ('b', 'c'), ('b', 'd'), ('b', 'e'), ('c', 'd'), ('c', 'e'), ('d', 'e'), ('a', 'b', 'c'), ('a', 'b', 'd'), ('a', 'b', 'e'), ('a', 'c', 'd'), ('a', 'c', 'e'), ('a', 'd', 'e'), ('b', 'c', 'd'), ('b', 'c', 'e'), ('b', 'd', 'e'), ('c', 'd', 'e'), ('a', 'b', 'c', 'd'), ('a', 'b', 'c', 'e'), ('a', 'b', 'd', 'e'), ('a', 'c', 'd', 'e'), ('b', 'c', 'd', 'e'), ('a', 'b', 'c', 'd', 'e')]
dataframeから特定の要素を抽出するには、df.loc[]で配列を渡してやればいいです。combinationsはタプルなので、まず配列に変換して、df.locに渡してやります。例えば1番最初の組合せを取り出すには、以下のようになります。
x = list(combinations[0])
df2 = df.loc[x]
df2の中身は出力はつぎのようになります。
sy su el
a 0.131750 0.469233 0.032909
b 0.433968 0.014887 0.557556
あとは、それぞれの組み合わせで取り出したDataFrameに対して、お好みの処理を行います。