我有一个包含4列的数据框:“ age_1”,“ name_1”,“ age_2”和“ name_2”。
df = pd.DataFrame(index=[0, 4, 6, 9],
data={'age_1': [18, np.nan, 12, np.nan],
'name_1': ['Fred', np.nan, 'Harry', np.nan],
'age_2': [np.nan, 34, np.nan, 45],
'name_2': [np.nan, 'Jim', np.nan, 'Fred']})
输出
age_1 name_1 age_2 name_2
0 18.0 Fred NaN NaN
4 NaN NaN 34.0 Jim
6 12.0 Harry NaN NaN
9 NaN NaN 45.0 Fred
所有名称都出现两次(一次在name_1中,一次在name_2中),我想将其中name_1和name_2具有相同项目的行放在一起。例如,从上面的代码段中,我希望将其放在第一行和最后一行像这样在一起:
age_1 name_1 age_2 name_2
0 18.0 Fred 45.0 Fred
任何帮助都会很棒
答案 0 :(得分:4)
您可以将数据框分为两部分,然后使用合并将它们合并。由于连接列name_1
和name_2
具有空值,因此必须首先删除空值。
l1 = ['age_1', 'name_1']
l2 = ['age_2', 'name_2']
df[l1].dropna().merge(df[l2].dropna(), left_on='name_1', right_on='name_2')
#outputs:
age_1 name_1 age_2 name_2
0 18.0 Fred 45.0 Fred
答案 1 :(得分:0)
如果df
是您的数据框:
df[["age_1", "name_1"]].dropna(how="all").join(df[["name_2", "age_2"]].dropna(how="all").set_index("name_2")[["age_2"]], on="name_1")
将大致提供您要查找的内容(该名称将不会像示例中那样重复,因为它是要连接的密钥,因此只会出现一次)。
请注意,这是左联接,所有没有相应name_2
的{{1}}都将被丢弃(但是,name_1
没有相应的name_1
, (例如name_2
,将保留下来)。如果要保留这些Harry
,只需将name_2
作为关键字参数添加到join方法。如果您确定所有名称都将始终出现两次,则无所谓。
如果how="outer"
有多个name_1
,则该行将重复以容纳尽可能多的name_2
。同样,如果每个名称都出现两次(在name_2
列中出现一次,而在name_1
列中出现一次),则无所谓。我会为此添加一张支票:
name_2
编辑:将dropna的内容添加为评论中的建议
答案 2 :(得分:0)
df= pd.DataFrame({'age_1':[18,'',12,''],'name_1':['Fred','','Harry',''],'age_2':['',34,'',45],'name_2':['','Jim','','Fred']})
df1=df[['age_1','name_1']]
df2=df[['age_2','name_2']]
df_new=df1.merge(df2,how='left',left_on='name_1',right_on='name_2' )
df_new=df_new.replace('',np.nan)
df_new.dropna(how='any',inplace =True)
df_new
输出
age_1 name_1 age_2 name_2
0 18.0 Fred 45.0 Fred