【问题标题】:How to create a join in Dataframe based on the other dataframe?如何基于其他数据框在数据框中创建连接?
【发布时间】:2019-07-03 13:30:08
【问题描述】:

我有 2 个数据框。一个包含学生批次详细信息,另一个包含分数。我想加入 2 个数据框。

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)

【问题讨论】:

  • 如果这与熊猫有关,您应该添加适当的标签。

标签: python pandas dataframe join mapping


【解决方案1】:

如果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

【讨论】:

    【解决方案2】:

    或者,您可以在创建 df2 的 2 个相关列的字典后使用 df.replace()

    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
    

    【讨论】:

    • @DevAnanth 很高兴。 :)
    • 还有一个问题,什么是我有另一列 S4 但我不想为该列应用映射?我们可以指定需要转换的列吗?
    猜你喜欢
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    相关资源
    最近更新 更多