pandas使用条件删除一列的重复项

时间:2014-11-04 20:54:09

标签: python pandas

我有一个这样的数据框:

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

2 个答案:

答案 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])