熊猫-如何匹配包含相同值的行

时间:2018-07-24 14:01:32

标签: python pandas

我有一个包含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

任何帮助都会很棒

3 个答案:

答案 0 :(得分:4)

您可以将数据框分为两部分,然后使用合并将它们合并。由于连接列name_1name_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