Python 熊猫会删除一列中具有条件的重复项

Python 熊猫会删除一列中具有条件的重复项,python,pandas,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,基本上),但如

我有这样一个数据帧:

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,基本上),但如果所有重复项中唯一的值是none,我仍然想保留它(如
239616417

它应减少到:

A   B
239616412   none
239616414   name2
239616417   none
239616418   name1
239616428   name1
239616429   name1

如果要删除任何重复项,这应该可以。排序将把所有有效条目放在NAs之后,因此它们将在
drop\u duplicate
逻辑中具有首选项

df.loc[df['B'] == 'none', 'B'] = np.nan
df = df.sort(['A','B']).drop_duplicates(subset='A')
如果希望保留重复的有效值,可以执行类似的操作,将数据拆分为null/notnull,然后重新组合

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])
这里有一个解决方案

首先对“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

如果
B
中有多个非无名称,您是否希望保留副本?我宁愿保留它们,但也可以删除它们,如果代码更容易这样做的话。上面提到的非无重复项只有5个左右,所以我可以管理它们。看起来第一个应该是
df.sort\u值
,最后一个是
df.sort\u索引