Python 在公共索引上合并两个数据帧(无需创建单独的行)

Python 在公共索引上合并两个数据帧(无需创建单独的行),python,pandas,dataframe,merge,Python,Pandas,Dataframe,Merge,我是新来的熊猫,一直在周围玩耍。我想基于一个共同的索引,用户id连接两个数据帧。不过,我还想做更多的工作。在第一个表(包含用户id及其年龄)中,每个用户id都是唯一的。在第二个表中(包含用户id及其课程,但不按用户id排序),可以有多个相同的用户id(因为用户可以参加多个课程,但每行仅包含一个用户id和一个课程)。数据集相当大,因此我无法手动执行此操作。如果我想加入,这样我仍然可以维护结果表中的用户id是唯一的属性,这样每一行都包含{user id,age,all-of-courses},我该怎

我是新来的熊猫,一直在周围玩耍。我想基于一个共同的索引,用户id连接两个数据帧。不过,我还想做更多的工作。在第一个表(包含用户id及其年龄)中,每个用户id都是唯一的。在第二个表中(包含用户id及其课程,但不按用户id排序),可以有多个相同的用户id(因为用户可以参加多个课程,但每行仅包含一个用户id和一个课程)。数据集相当大,因此我无法手动执行此操作。如果我想加入,这样我仍然可以维护结果表中的用户id是唯一的属性,这样每一行都包含{user id,age,all-of-courses},我该怎么做呢

例如,我可能有类似

Table 1:             Table 2:
User Id Age          User Id  Coursework
1       18           1        Pre Calculus
2       17           2        Chemistry
3       18           3        English
4       16           2        Linear Algebra
                     1        World History
                     4        Multivariable Calculus
                     1        Psychology
                     3        Government
                     4        Physics (E&M)
我希望结果如下所示:

User Id Age  Coursework
1       18   Pre Calculus, World History, Psychology
2       17   Chemistry, Linear Algebra
3       18   English, Government
4       16   Multivariable Calculus, Physics (E&M)
我将如何以尽可能简单的方式来做这件事?它可能需要一种不同的方法,而不仅仅是合并并在此基础上做一些事情。无论如何,这对于我使用大型数据集所做的事情来说非常有用。提前谢谢你的帮助

我首先转换(分组)第二个DF,然后将其与第一个DF合并:

In [11]: b.groupby('User_Id', as_index=False)[['Coursework']] \
          .agg(', '.join).merge(a, on='User_Id')
Out[11]:
   User_Id                               Coursework  Age
0        1  Pre Calculus, World History, Psychology   18
1        2                Chemistry, Linear Algebra   17
2        3                      English, Government   18
3        4    Multivariable Calculus, Physics (E&M)   16
数据:

说明:

In [15]: b.groupby('User_Id', as_index=False)[['Coursework']].agg(', '.join)
Out[15]:
   User_Id                               Coursework
0        1  Pre Calculus, World History, Psychology
1        2                Chemistry, Linear Algebra
2        3                      English, Government
3        4    Multivariable Calculus, Physics (E&M)
我认为您需要使用
应用
加入

另一个解决方案包括:


非常感谢。这非常有帮助,很高兴看到两种方法。我认为如果数据帧越大,
concat
可以更快。在我看来,您可以向上投票两个答案(单击接受标记上方的小三角形
0
)。然后选择一个被接受的答案(由您决定)。好天气;)谢谢你这么快的回复!这非常有用!
In [15]: b.groupby('User_Id', as_index=False)[['Coursework']].agg(', '.join)
Out[15]:
   User_Id                               Coursework
0        1  Pre Calculus, World History, Psychology
1        2                Chemistry, Linear Algebra
2        3                      English, Government
3        4    Multivariable Calculus, Physics (E&M)
df2 = df2.groupby('User Id')['Coursework'].apply(', '.join).reset_index()
#default inner join
df = pd.merge(df1, df2, on='User Id')
#for left join (if some values in df2 are missing)
#df = pd.merge(df1, df2, on='User Id', how='left')
print (df)
   User Id  Age                               Coursework
0        1   18  Pre Calculus, World History, Psychology
1        2   17                Chemistry, Linear Algebra
2        3   18                      English, Government
3        4   16    Multivariable Calculus, Physics (E&M)
df2 = df2.groupby('User Id')['Coursework'].apply(', '.join)
df1 = df1.set_index('User Id')
df = pd.concat([df1, df2], axis=1, join='inner').reset_index()
print (df)
   User Id  Age                               Coursework
0        1   18  Pre Calculus, World History, Psychology
1        2   17                Chemistry, Linear Algebra
2        3   18                      English, Government
3        4   16    Multivariable Calculus, Physics (E&M)