Python 合并具有相同列名和不同行大小的DFs,在重复行处填充NAN

Python 合并具有相同列名和不同行大小的DFs,在重复行处填充NAN,python,pandas,dataframe,Python,Pandas,Dataframe,对于这个问题,我有以下两个生成的数据帧: df1=pd.DataFrame{model:[fmodel{i//2}表示范围6中的i],label:[flabel{i}表示范围6中的i],data:[fdata{i}表示范围6中的i]} df1=df1.set\U索引模型 df2=pd.DataFrame{model:[fmodel{i}表示范围3中的i],info:[finfo{i}表示范围3中的i],stuff:[fstuff{i}表示范围3中的i]} df2=df2.set\u索引模型 df

对于这个问题,我有以下两个生成的数据帧:

df1=pd.DataFrame{model:[fmodel{i//2}表示范围6中的i],label:[flabel{i}表示范围6中的i],data:[fdata{i}表示范围6中的i]} df1=df1.set\U索引模型 df2=pd.DataFrame{model:[fmodel{i}表示范围3中的i],info:[finfo{i}表示范围3中的i],stuff:[fstuff{i}表示范围3中的i]} df2=df2.set\u索引模型 df1看起来是这样的:

[model]  label   data   
model0  label_0 data_0
model0  label_1 data_1
model1  label_2 data_2
model1  label_3 data_3
model2  label_4 data_4
model2  label_5 data_5
df2也是这样:

其中[…]表示数据帧的索引。我希望以某种方式连接这两个数据帧以输出以下内容:

[model]  info    stuff  label   data   
model0  info_0  stuff_0 label_0 data_0
model0    NAN     NAN   label_1 data_1
model1  info_1  stuff_1 label_2 data_2
model1    NAN     NAN   label_3 data_3
model2  info_2  stuff_2 label_4 data_4
model2    NAN     NAN   label_5 data_5
我似乎找不到任何关于如何进行上述操作的文档。我已经尝试了join、concat和merge的多种代码组合,但都没有结果。我知道我可以编写一个函数来实现这一点,但我希望可以通过Pandas原生join、concat和merge函数进行管理


如果有谁对熊猫更有经验,能指引我走向正确的方向,我将不胜感激

首先我们重置索引,以便可以合并模型列上的两个数据帧。然后,您可以使用pd.Series中的duplicated方法屏蔽重复项,然后用NaN填充它们:


新数据帧df_new是所需的结果。

首先我们重置索引,以便可以合并模型列上的两个数据帧。然后,您可以使用pd.Series中的duplicated方法屏蔽重复项,然后用NaN填充它们:


新数据帧df_new是想要的结果。

这是另一种方法:

import pandas as pd

df1 = pd.DataFrame({"model": [f"model{i//2}" for i in range(6)], "label": [f"label_{i}" for i in range(6)], "data": [f"data_{i}" for i in range(6)]})
df1 = df1.set_index("model")

df2 = pd.DataFrame({"model": [f"model{i}" for i in range(3)], "info": [f"info_{i}" for i in range(3)], "stuff": [f"stuff_{i}" for i in range(3)]})
df2 = df2.set_index("model")

df1_g = df1.groupby(by='model').first()
print(pd.concat([df1_g, df2], axis=1).append( df1[~df1.isin(df1_g)].dropna(), sort=False ).sort_index() )
印刷品:

          label    data    info    stuff
model                                   
model0  label_0  data_0  info_0  stuff_0
model0  label_1  data_1     NaN      NaN
model1  label_2  data_2  info_1  stuff_1
model1  label_3  data_3     NaN      NaN
model2  label_4  data_4  info_2  stuff_2
model2  label_5  data_5     NaN      NaN

这是另一种方法:

import pandas as pd

df1 = pd.DataFrame({"model": [f"model{i//2}" for i in range(6)], "label": [f"label_{i}" for i in range(6)], "data": [f"data_{i}" for i in range(6)]})
df1 = df1.set_index("model")

df2 = pd.DataFrame({"model": [f"model{i}" for i in range(3)], "info": [f"info_{i}" for i in range(3)], "stuff": [f"stuff_{i}" for i in range(3)]})
df2 = df2.set_index("model")

df1_g = df1.groupby(by='model').first()
print(pd.concat([df1_g, df2], axis=1).append( df1[~df1.isin(df1_g)].dropna(), sort=False ).sort_index() )
印刷品:

          label    data    info    stuff
model                                   
model0  label_0  data_0  info_0  stuff_0
model0  label_1  data_1     NaN      NaN
model1  label_2  data_2  info_1  stuff_1
model1  label_3  data_3     NaN      NaN
model2  label_4  data_4  info_2  stuff_2
model2  label_5  data_5     NaN      NaN