python - 两个数据帧的 Pandas 合并的输出不会产生预期的形状

标签 python pandas merge

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

enter image description here

最佳答案

执行连接时必须重复,例如:

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数据帧将被复制,以适应数据帧传递的所有值。

    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的长度匹配。

关于python - 两个数据帧的 Pandas 合并的输出不会产生预期的形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58221553/

相关文章:

python - Pandas 按具有混合列数据类型的日期列进行过滤

python - 滚动窗口上的 Pandas groupby

merge - 合并两个 Sass 文件

python - 如何在Python 2中实现中缀运算符矩阵乘法?

python - Pygame 无法加载背景图像?

python - 如何联合更新两个数据帧?

pandas - 使用 Pandas ,如何在变量索引上连接两个表?

linux - 将一个文件夹与源合并到另一个文件夹中

python - 多行用户输入python

python - 更改 Path PosixPath 对象中的文件名前缀