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

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

最佳答案

执行加入时,您必须重复,例如:

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中存在多个process_date值,即使合并为right_df,因此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的长度匹配。

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

10-12 23:25