2017-08-28 23 views
2

私はリストを持っています。私は、結果のデータフレームがデカルト積の形で既存のデータフレームにインデックスを設定するにはどうすればよいですか?

 
    0 1 2 
A 0 0 0 
A 1 1 1 
A 2 2 2 
B 0 0 0 
B 1 1 1 
B 2 2 2 

私はこれをどのように行うことができますようになりたいデータフレームすなわち

li = ['A','B'] 
df = pd.DataFrame([[0,0,0],[1,1,1],[2,2,2]]) 

でリスト値のデカルト積の形でデータフレームのset_indexしたいですか? reindex

答えて

3

オプション

pd.concat([df] * len(li), keys=li) 

    0 1 2 
A 0 0 0 0 
    1 1 1 1 
    2 2 2 2 
B 0 0 0 0 
    1 1 1 1 
    2 2 2 2 

は、あなたの出力を正確に複製するために1
pd.concat引数keysで:

pd.concat([df] * len(li), keys=li).reset_index(1, drop=True) 

    0 1 2 
A 0 0 0 
A 1 1 1 
A 2 2 2 
B 0 0 0 
B 1 1 1 
B 2 2 2 

オプション2
np.tilenp.repeat

pd.DataFrame(np.tile(df, [len(li), 1]), np.repeat(li, len(df)), df.columns) 

    0 1 2 
A 0 0 0 
A 1 1 1 
A 2 2 2 
B 0 0 0 
B 1 1 1 
B 2 2 2 
+1

私はpd.concatを試しましたが、このようにはしませんでした。これは本当にいいですね。 – Dark

2

使用MultiIndex.from_product

mux = pd.MultiIndex.from_product([li, df.index]) 
df = df.reindex(mux, level=1).reset_index(level=1, drop=True) 
print (df) 
    0 1 2 
A 0 0 0 
A 1 1 1 
A 2 2 2 
B 0 0 0 
B 1 1 1 
B 2 2 2 
+1

私は再インデックス部分を見逃しました。どうもありがとうございます。 – Dark

0

または使用することができます。

li = [['A','B']] 
df['New']=li*len(df) 
df.set_index([0,1,2])['New'].apply(pd.Series).stack().to_frame().rename(columns={0:'keys'})\ 
    .reset_index().drop('level_3',1).sort_values('keys') 

Out[698]: 
    0 1 2 keys 
0 0 0 0 A 
2 1 1 1 A 
4 2 2 2 A 
1 0 0 0 B 
3 1 1 1 B 
5 2 2 2 B 
+1

あなたはunlist〜を知っている必要があります: – Wen

+1

私は最初にこれを考えて正直言って温。神に誓って、あなたの解決策を以前のいくつかの質問にコピーしませんでした。そしてこれは少しでも苦労する可能性もあります。 – Dark

+0

@Bharathshetty、それは大丈夫です〜私も他人からそれを学ぶ〜:)幸せなコーディング – Wen

関連する問題