Pandas用criteri删除一个列的副本

2024-04-29 05:40:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数据帧:

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的重复项,并且我希望保留其中包含任何名称的行(!=none,基本上)在列B中,但是如果所有重复项中的唯一值是none,我仍然希望保留它(比如239616417)。在

应减少到:

^{pr2}$

Tags: 数据名称nonename1pr2name2
2条回答

这里有一个解决方案。在

首先按“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”:

^{pr2}$

您可以对数据帧进行重新排序以获得所需的内容:

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

如果你想删除任何副本,这应该可以。排序将把所有有效的条目放在NAs之后,因此它们在drop_duplicate逻辑中具有优先权。在

df.loc[df['B'] == 'none', 'B'] = np.nan
df = df.sort(['A','B']).drop_duplicates(subset='A')

如果您希望保留重复的有效值,可以执行类似的操作,将数据拆分为nulls/notnull,然后重新组合。在

^{pr2}$

相关问题 更多 >