如何创建基于其他数据帧数据帧中的一个连接?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何创建基于其他数据帧数据帧中的一个连接?相关的知识,希望对你有一定的参考价值。

我有2个dataframes。其中包含学生批细节和另一个点。我想加入2个dataframes。

Dataframe1包含

+-------+-------+-------+--+
|  s1   |  s2   |  s3   |  |
+-------+-------+-------+--+
| Stud1 | Stud2 | Stud3 |  |
| Stud2 | Stud4 | Stud1 |  |
| Stud1 | Stud3 | Stud4 |  |
+-------+-------+-------+--+

Dataframe2包含

+-------+-------+----------+--+
| Name  | Point | Category |  |
+-------+-------+----------+--+
| Stud1 |    90 | Good     |  |
| Stud2 |    80 | Average  |  |
| Stud3 |    95 | Good     |  |
| Stud4 |    55 | Poor     |  |
+-------+-------+----------+

我试图标记映射为每个学生相同的数据集。

+-------+-------+-------+----+----+----+
| Stud1 | Stud2 | Stud3 | 90 | 80 | 95 |
| Stud2 | Stud4 | Stud1 | 80 | 55 | 90 |
| Stud1 | Stud3 | Stud4 | 90 | 95 | 55 |
+-------+-------+-------+----+----+----+

我想下面的代码,但它是由一个替代值之一。

s = df3['p1'].map(dfnamepoints.set_index('name')['points'])
df4 = df3.drop('p1', 1).assign(points = s)
答案

解决方案的工作相同的,如果在列df3存在从Name所有值:

s = dfnamepoints.set_index('Name')['Point']
df = df3.join(df3.replace(s).add_prefix('new_'))

要么:

df = df3.join(df3.apply(lambda x: x.map(s)).add_prefix('new_'))

要么:

df = df3.join(df3.applymap(s.get).add_prefix('new_'))

print (df)
      s1     s2     s3  new_s1  new_s2  new_s3
0  Stud1  Stud2  Stud3      90      80      95
1  Stud2  Stud4  Stud1      80      55      90
2  Stud1  Stud3  Stud4      90      95      55

如果没有,输出是不同的 - 不存在的值(Stud1)得到NaNs:

print (dfnamepoints)
    Name  Point Category
0  Stud2     80  Average
1  Stud3     95     Good
2  Stud4     55     Poor

df = df3.join(df3.applymap(s.get).add_prefix('new_'))
#or 
df = df3.join(df3.applymap(s.get).add_prefix('new_'))

print (df)
      s1     s2     s3  new_s1  new_s2  new_s3
0  Stud1  Stud2  Stud3     NaN      80    95.0
1  Stud2  Stud4  Stud1    80.0      55     NaN
2  Stud1  Stud3  Stud4     NaN      95    55.0

而对于replace得到原始值:

df = df3.join(df3.replace(s).add_prefix('new_'))
print (df)
      s1     s2     s3 new_s1  new_s2 new_s3
0  Stud1  Stud2  Stud3  Stud1      80     95
1  Stud2  Stud4  Stud1     80      55  Stud1
2  Stud1  Stud3  Stud4  Stud1      95     55
另一答案

Alternativey,你可以创建df.replace()的2列有关的字典后使用df2

pd.concat([df1,df1.replace(dict(zip(df2.Name,df2.Point))).add_prefix('new_')],axis=1)

输出:

      s1     s2     s3  new_s1  new_s2  new_s3
0  Stud1  Stud2  Stud3      90      80      95
1  Stud2  Stud4  Stud1      80      55      90
2  Stud1  Stud3  Stud4      90      95      55

以上是关于如何创建基于其他数据帧数据帧中的一个连接?的主要内容,如果未能解决你的问题,请参考以下文章

如何在数据帧中沿值的一列生成随机均匀分布而不必对所述列中的每个值重复?

如何根据 Spark Scala 中其他数据帧中的多列匹配过滤数据帧

如何使用基于整数位置的索引访问 MultiIndex 数据帧中的行

如何删除数据帧中的间隔之间的值

Spark SCALA - 连接两个数据帧,其中一个数据帧中的连接值位于第二个数据帧中的两个字段之间

如何从Spark数据帧中的When子句向udf发送多个列?