Pandas:合并两个具有不同行数的 df

Dei*_*aak 4 python merge pandas

我有两个数据框,它们都有一个列,其中可以具有相同的数字/值。一个大约 300 行的小 df(这是我的主文件)和 1 个大约 5000 行的 df。我想合并 1 列,但打印数据时无法获得相同数量的行。

第一个(小)数据框(左):

import pandas as pd
df1 = pd.read_excel('./file.xlsx')
df1 = df.replace(' ', np.nan)
df1.head()
 
         col1       

row1     123456                         
row2     123457                        
row3     123458                             
row4     123459                            
row5     123450                            
Run Code Online (Sandbox Code Playgroud)

第二个(大)df(右):

import pandas as pd
df2 = pd.read_excel('./file2.xlsx')
df2 = df.replace(' ', np.nan)
df2
 
         col1       col2      

row1     123456     hello1                    
row2     123457     hello2                    
row3     123458     hello3                        
row4     123459     hello4                        
row5     123450     hello4 
row7     555555     street1
row8     666666     street1 
row9     777777     street1        
Run Code Online (Sandbox Code Playgroud)

我试过:

merged = pd.merge(left=df1, right=df2, how='inner', left_on='col1', right_on='col1')
print("Orginele data", len(df1))
print("Merged data", len(df2))
Run Code Online (Sandbox Code Playgroud)

当我打印时,我在左侧 df 中看到大约 30k 行,但我只想查看左侧 df 中使用的行(约 300 行)。其中大多数是 NaN。我尝试更改“how=”,但这不起作用。我还检查了帖子“Merging 101”,但似乎无法弄清楚这一点。

左侧(小)数据帧的预期结果:

         col1       col2      

row1     123456     hello1                    
row2     123457     hello2                    
row3     123458     hello3                        
row4     123459     hello4                        
row5     123450     hello4 
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助和努力。谢谢你!

小智 5

尝试dataframe.join指定how='left默认值

import pandas as pd
df = pd.DataFrame({"a": [0,0,1,1,2,2,2,]})
df2 = pd.DataFrame({"a": [0, 1,2,3,4,5,6,7,8,9], "b": list("abcdefghij")})
df.join(df2, on="a", lsuffix="df_a", rsuffix="df_b")

# output
  adf_a adf_b   b
0   0   0       a
1   0   0       a
2   1   1       b
3   1   1       b
4   2   2       c
5   2   2       c
6   2   2       c
Run Code Online (Sandbox Code Playgroud)