2016-12-02 14 views
1

私はpandas DataFrameを使用しています。使用する列の値はリストです。私は各リストの2つの要素を1つずつ結合し、別のDataFrameに出力したい。
たとえば、col_acol_bを含むデータフレームdfがあります。 col_bの値はリストです。私はdf.col_bの値をループし、ペアのリストを出力したい。pandasループ列の値

import pandas as pd 

df=pd.DataFrame({'col_a':['ast1','ast2','ast3'],'col_b':[['text1','text2','text3'],['mext1','mext2','mext3'],['cext1','cext2']]}) 
df 

    col_a col_b 
0 ast1 [text1, text2, text3] 
1 ast2 [mext1, mext2, mext3] 
2 ast3 [cext1, cext2] 

私はこれ欲しい:

from itertools import combinations 
(df.groupby('col_a')['col_b'] 
    .apply(lambda x: pd.Series(list(combinations(x.iloc[0], 2)))) 
    .reset_index(level = 0)) 

# col_a   col_b 
#0 ast1 (text1, text2) 
#1 ast1 (text1, text3) 
#2 ast1 (text2, text3) 
#0 ast2 (mext1, mext2) 
#1 ast2 (mext1, mext3) 
#2 ast2 (mext2, mext3) 
#0 ast3 (cext1, cext2) 

答えて

1

itertoolsを使用してリストをフラット化できます。

import itertools 
series = df["col_b"].apply(lambda x: \ 
    pd.Series(list(itertools.combinations(x,2)))).stack() 

シリーズは、「母」のデータフレームとマージ可能であることを名前を持っている必要があります。二つのデータオブジェクトをマージし、今

series.name = "col_b_1" 

としたい列を選択:

result = df.merge(pd.DataFrame(series).reset_index(), 
    left_index=True, 
    right_on="level_0")[["col_a","col_b_1"]] 

結果はタプルの列です。これがOKでない場合は、.apply()ファンクションlist()となります。

# col_a   col_b_1 
# 0 ast1 (text1, text2) 
# 1 ast1 (text1, text3) 
# 2 ast1 (text2, text3) 
# 3 ast2 (mext1, mext2) 
# 4 ast2 (mext1, mext3) 
# 5 ast2 (mext2, mext3) 
# 6 ast3 (cext1, cext2) 
1

:あなたのcol_aが行ごとに一意の値を持っている、あなたはリスト要素のすべての2組を生成するitertoolsからcombinationsを使用することができると仮定すると、

col_a col_b_1 
0 ast1 [text1, text2] 
1 ast1 [text1, text3] 
2 ast1 [text2, text3] 
3 ast2 [mext1, mext2] 
4 ast2 [mext1, mext3] 
5 ast2 [mext2, mext3] 
6 ast3 [cext1, cext2] 
関連する問題