2017-03-08 43 views
1

我目前有一个熊猫数据框,在单个问题上有很多答案,所以我想把它变成一个列表,这样我就可以做余弦相似。如何将熊猫数据框转换为有多对一关系的有序列表?

目前,我有数据框,这里的问题是由通过PARENT_ID = q_id答案加盟,如图片所示:

many answers to one question dataframe

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 

,我期待的产品是:

( “问题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。 –

+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 

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

看它是否有助于你

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                     

这将创建一个新的列输出与期望的结果。

相关问题