如果多个列包含相同的数据但是互换,则从pandas DataFrame中删除行

时间:2018-01-05 14:54:13

标签: python pandas dataframe duplicates

我有一个pandas DataFrame,在&name;' name_x'和' name_y'列和关联的ID:

    id  name_x  name_y
0   104 molly   james
1   104 sarah   adam
2   236 molly   adam
3   388 adam    sarah
4   388 johnny  pete
5   236 adam    james
6   236 pete    johnny

我想删除'重复' id编号相同的行,两个名称一起出现在任一名称列中。 例如

这样就删除了索引为1的行,因为这对名称' molly'和詹姆斯'已经出现了id为104.类似地,索引为6的行被删除为一对名称" adam'和莎拉'已经出现了id 104,以便DataFrame看起来像这样:

    count   ids        name_x   name_y
0   1       104        molly    james
1   2       [104, 388] sarah    adam
2   1       236        molly    adam
3   2       [388, 236] johnny   pete
4   1       236        adam     james

(名字的排序无关紧要)

然后,我希望能够创建另一个DataFrame,它显示名称对的数量,具体取决于它们出现的次数与不同的ID和那些ID,例如:

<form enctype="multipart/form-data" action="/Filebrowser?Path=/S71500/" method="POST" onsubmit="return checkUploadFile()">
<td><input id="filebrowser_upload_filename" type="file" name="filename" size="30" maxlength="80" style="background-color: transparent;"></td>
<td><input type="submit" value="Datei laden"></td> 
</form>

我是编程/ python / pandas的新手,还没有找到答案!谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用:

  • 首先使用names
  • 对列进行排序
  • groupby,转换为set s然后转换为list s
  • len
  • 获取list s的长度
  • 如有必要,请使用maskindexing with str一起使用标量list s
df[['name_x','name_y']] = np.sort( df[['name_x','name_y']], axis=1)

df=df.groupby(['name_x','name_y'])['id'].apply(lambda x:list(set(x))).reset_index(name='ids')
df['count'] = df['ids'].str.len()
print (df)
   name_x name_y         ids  count
0    adam  james       [236]      1
1    adam  molly       [236]      1
2    adam  sarah  [104, 388]      2
3   james  molly       [104]      1
4  johnny   pete  [388, 236]      2
df['ids'] = df['ids'].mask(df['count'] == 1, df['ids'].str[0])
print (df)
   name_x name_y         ids  count
0    adam  james         236      1
1    adam  molly         236      1
2    adam  sarah  [104, 388]      2
3   james  molly         104      1
4  johnny   pete  [388, 236]      2