2017-03-08 7 views
1

私は現在、1つの質問に多数の回答が加わっているパンダのデータフレームを持っています。そのため、私はコサインの類似性を実現できるようにリストに変換しようとしています。写真のようにpandasデータフレームを多対1リレーションシップの順序付きリストに変換するにはどうすればよいですか?

は現在、私は、質問は、PARENT_ID = q_idて答えによって接合されたデータフレームを、持っている:

print (df) 
    q_id  q_body parent_id a_body 
0  1 question 1   1 answer 1 
1  1 question 1   1 answer 2 
2  1 question 1   1 answer 3 
3  2 question 2   2 answer 1 
4  2 question 2   2 answer 2 

many answers to one question dataframeと私が探しています製品です:

( "質問1"、 "解答1"、 "解答2"、 "解答3")

( "質問2"、 "解答1"、 "解答2")

ご協力いただければ幸いです!どうもありがとうございました。

答えて

2

は、私はあなたが必要だと思うgroupbyapplyと:

#output is tuple with question value 
df = df.groupby('q_body')['a_body'].apply(lambda x: tuple([x.name] + list(x))) 
print (df) 
q_body 
question 1 (question 1, answer 1, answer 2, answer 3) 
question 2    (question 2, answer 1, answer 2) 
Name: a_body, dtype: object 

#output is list with question value 
df = df.groupby('q_body')['a_body'].apply(lambda x: [x.name] + list(x)) 
print (df) 
q_body 
question 1 [question 1, answer 1, answer 2, answer 3] 
question 2    [question 2, answer 1, answer 2] 
Name: a_body, dtype: object 
#output is list without question value 
df = df.groupby('q_body')['a_body'].apply(list) 
print (df) 
q_body 
question 1 [answer 1, answer 2, answer 3] 
question 2    [answer 1, answer 2] 
Name: a_body, dtype: object 

#grouping by parent_id without question value 
df = df.groupby('parent_id')['a_body'].apply(list) 
print (df) 
parent_id 
1 [answer 1, answer 2, answer 3] 
2    [answer 1, answer 2] 
Name: a_body, dtype: object 

#output is string, values are concanecated by , 
df = df.groupby('parent_id')['a_body'].apply(', '.join) 
print (df) 
parent_id 
1 answer 1, answer 2, answer 3 
2    answer 1, answer 2 
Name: a_body, dtype: object 

しかし、リストとして必要出力が追加した場合tolist

L = df.groupby('q_body')['a_body'].apply(lambda x: tuple([x.name] + list(x))).tolist() 
print (L) 
[('question 1', 'answer 1', 'answer 2', 'answer 3'), ('question 2', 'answer 1', 'answer 2')] 
+0

jezraelさん、ありがとうございました。もっと今lambda alotを使用しています。 –

+0

うれしいことができます。いい日。 – jezrael

2
df = pd.DataFrame([ 
     ['question 1', 'answer 1'], 
     ['question 1', 'answer 2'], 
     ['question 1', 'answer 3'], 
     ['question 2', 'answer 1'], 
     ['question 2', 'answer 2'], 
    ], columns=['q_body', 'a_body']) 

print(df) 

     q_body a_body 
0 question 1 answer 1 
1 question 1 answer 2 
2 question 1 answer 3 
3 question 2 answer 1 
4 question 2 answer 2 

それはあなたが

result = df.groupby('q_id').agg({'q_body': lambda x: x.iloc[0], 'a_body': lambda x: ', '.join(x)}) 
result['output'] = result.q_body + ', ' + result.a_body                     

これは望ましい結果で、新しい列出力を作成する場合に役立ちます210

apply(list)

df.groupby('q_body').a_body.apply(list) 

q_body 
question 1 [answer 1, answer 2, answer 3] 
question 2    [answer 1, answer 2] 
0

を参照してください。

関連する問題