【问题标题】:Output of a Pandas Merge of two data frames does not produce the expected shape两个数据帧的 Pandas 合并输出不会产生预期的形状
【发布时间】:2020-02-01 21:58:48
【问题描述】:

我正在使用“左合并”合并两个数据帧,但是,输出中的行数不等于左数据帧中的行数。 我期望 df_bd 的形状为 (58233, 10)。

【问题讨论】:

  • 你在 full_name 中有重复,这就是为什么他们中的一些人在做交叉连接
  • df/bdfull_name 上是否有任何重复项?
  • 请尝试发布代码而不是图片。

标签: python pandas merge


【解决方案1】:

在执行Join时必须重复,例如:

import pandas as pd
left_data = {'name':['John','Mark'],'value':[1,5]}
right_data = {'name':['John','Mark','John','Mark'],'children':['Celius','Stingher','Celius','Stingher'],'process_date':['2019-02-05','2019-02-05','2019-03-05','2019-03-05']}
left_df = pd.DataFrame(left_data)
right_df = pd.DataFrame(right_data)
right_df['process_date'] = pd.to_datetime(right_df['process_date'])

这就是它们的样子:

print(left_df)
   name  value
0  John      1
1  Mark      5
print(right_df)
       name  children process_date
0  John    Celius   2019-02-05
1  Mark  Stingher   2019-02-05
2  John    Celius   2019-03-05
3  Mark  Stingher   2019-03-05

即使合并为left,因为right_df 中有多个process_date 值,因此left 数据帧将被复制以适应right 数据帧传递的所有值。

    df = left_df.merge(right_df,how='left',left_on='name',right_on='name')
    print(df)
   name  value  children process_date
0  John      1    Celius   2019-02-05
1  John      1    Celius   2019-03-05
2  Mark      5  Stingher   2019-02-05
3  Mark      5  Stingher   2019-03-05

过滤此问题的一种方法是按特定顺序过滤.sort_values(),然后过滤.drop_duplicates(subset=list(left_df),keep={'last','first'})。通过这种方式,我们消除了重复行并保留了最新的可用信息:

df = df.sort_values('process_date',ascending=True).drop_duplicates(list(left_df),keep='last')
print(df)
   name  value  children process_date
1  John      1    Celius   2019-03-05
3  Mark      5  Stingher   2019-03-05

合并数据帧的长度,匹配left_df的长度。

【讨论】:

    猜你喜欢
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 2021-03-06
    • 1970-01-01
    • 2018-05-03
    • 2020-10-08
    • 2022-11-25
    相关资源
    最近更新 更多