不带空行的Pandas drop_duplicates()

ar7v8xwq  于 2023-03-06  发布在  其他
关注(0)|答案(3)|浏览(125)

我有两个相等的列在Pandas数据框。每列有相同的副本。

A B
1 1
1 1
2 2
3 3
3 3
4 4
4 4

我只想删除列B中的重复项,目标如下:

A B
1 1
1 2
2 3
3 4
3 
4 
4

我在一个新的DataFrame中克隆了列B,并使用了drop_duplicates()。新的DataFrame在drop_duplicates()之后只有列B,如下所示:

B
1
2
3
4

但当我把它放回原始数据框时,它看起来像这样:

A B
1 1
1 
2 2
3 3
3 
4 4
4

我的代码:

df[['A','B']]
df1=df['B']
df1=df1.sort_values()
df1.drop_duplicates(keep='first', inplace=True)
df1.to_numpy()
df['B']=df1
sr4lhrrt

sr4lhrrt1#

您可以使用drop_duplicates,然后使用set_axis重新索引输出,以强制在前几行上对齐索引:

s = df['B'].drop_duplicates()
#s = df.drop_duplicates()['B'] # alternative if you want to consider A+B

df['B'] = s.set_axis(df.index[:len(s)])
  • 注意:此解决方案适用于df任何原始索引,而不仅仅适用于范围索引。*

输出:

A    B
0  1  1.0
1  1  2.0
2  2  3.0
3  3  4.0
4  3  NaN
5  4  NaN
6  4  NaN
mm5n2pyu

mm5n2pyu2#

你能做到

df['B'] = df['B'].drop_duplicates().reset_index(drop=True)
# or with DataFrame.drop_duplicates which can take a ignore_index parameter.
df['B'] = df[['B']].drop_duplicates(ignore_index=True)
print(df)

   A    B
0  1  1.0
1  1  2.0
2  2  3.0
3  3  4.0
4  3  NaN
5  4  NaN
6  4  NaN
shstlldc

shstlldc3#

如果默认索引从列表中重新创建列:

df['B'] = pd.Series(df['B'].drop_duplicates().tolist())
#alternative
#df['B'] = pd.Series(pd.unique(df['B']).tolist())
print (df)
   A    B
0  1  1.0
1  1  2.0
2  2  3.0
3  3  4.0
4  3  NaN
5  4  NaN
6  4  NaN

如果有索引也过滤,则首先按列表长度归纳:

L = df['B'].drop_duplicates().tolist()
#L = pd.unique(df['B']).tolist()
df['B'] = pd.Series(L, index=df.index[:len(L)])

或者:

a = pd.unique(df['B'])
df['B'] = np.hstack([a, np.full((len(df) - len(a), ), np.nan)])
print (df)
   A    B
0  1  1.0
1  1  2.0
2  2  3.0
3  3  4.0
4  3  NaN
5  4  NaN
6  4  NaN

相关问题