我有一个这样的数据框:
A B
239616412 none
239616414 name2
239616417 none
239616417 none
239616417 none
239616418 name1
239616418 none
239616428 name1
239616429 none
239616429 none
239616429 name1
我想删除A列的重复项,我想在B列中保留其中包含任何类型名称的行(!= none,基本上),但是如果所有重复项中的唯一值都是没有,我仍然希望保留它(如239616417
)。
应该减少到:
A B
239616412 none
239616414 name2
239616417 none
239616418 name1
239616428 name1
239616429 name1
答案 0 :(得分:5)
这是一个解决方案。
首先对列'B'进行排序:
df.sort('B', inplace=True)
df
Out[24]:
A B
5 239616418 name1
7 239616428 name1
10 239616429 name1
1 239616414 name2
0 239616412 NaN
2 239616417 NaN
3 239616417 NaN
4 239616417 NaN
6 239616418 NaN
8 239616429 NaN
9 239616429 NaN
然后删除重复项w.r.t.列'A':
df.drop_duplicates('A', inplace=True)
df
Out[26]:
A B
5 239616418 name1
7 239616428 name1
10 239616429 name1
1 239616414 name2
0 239616412 NaN
2 239616417 NaN
您可以对数据框进行重新排序,以获得您想要的内容:
df.sort(inplace=True)
df
Out[30]:
A B
0 239616412 NaN
1 239616414 name2
2 239616417 NaN
5 239616418 name1
7 239616428 name1
10 239616429 name1
答案 1 :(得分:0)
如果你想删除任何重复项,这应该有效。排序将在NA之后放置所有有效条目,因此它们将在drop_duplicate
逻辑中具有首选项。
df.loc[df['B'] == 'none', 'B'] = np.nan
df = df.sort(['A','B']).drop_duplicates(subset='A')
如果您希望保留重复的有效值,则可以执行类似的操作,将数据拆分为nulls / not-null,然后重新组合。
valids = df.dropna().drop_duplicates()
invalids = df[pd.isnull(df['B'])].drop_duplicates()
invalids = invalids[~invalids['A'].isin(valids['A'])]
df = pd.concat([valids, invalids])