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