删除包含在pandas中的两个列中的重复项



我有一个有两列的数据框架。我想删除这样的行:对于每一行,它只包含第一列中的一个实例,但包含第二列中的所有惟一值。

下面是一个例子:

data = [[1,100],
[1,101],
[1,102],
[1,103],
[2,102],
[2,104],
[2,105],
[3,102],
[3,107]]
df = pd.DataFrame(data,columns = ['x', 'y'])

数据帧看起来像这样:

x    y
0  1  100
1  1  101
2  1  102
3  1  103
4  2  102
5  2  104
6  2  105
7  3  102
8  3  107

输出数据框看起来像这样:

x    y  inc
0  1  100    1
1  1  101    0
2  1  102    0
3  1  103    0
4  2  102    1
5  2  104    0
6  2  105    0
7  3  102    0
8  3  107    1

,因此第0行将被包括在内(inc),因为1还没有在x列中重复。第1-3行将被排除,因为x列中的1已经被考虑在内。第4行将被包括在内,因为x列中的2还没有被包括在内,y列(102)还没有被包括在内(它被排除为重复)。在第7行,列x中的第一个实例3将被排除,因为102(列y)已经在第4行中被记录。因此,我们将跳到第8行并包含它。

我已经尝试了各种各样的.duplicated方法,但到目前为止都没有效果。如果只取列x中值的第一个实例,则会排除应该包含的行(例如第7行)。

如有任何帮助,不胜感激。

一种方法是使用set并创建自定义函数:

seen = set()
def func(d):
res = d[~d.isin(seen)]
if len(res):
cur = res.iat[0]
seen.add(cur)
return cur
print (df.groupby("x")["y"].apply(func))
x
1    100
2    102
3    107
Name: y, dtype: int64

我相信您只需将drop_duplicates'x'的子集一起使用,并指定'first'将保留哪些行。

df.drop_duplicates(keep='first', subset = 'x')

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.drop_duplicates.html

相关内容

  • 没有找到相关文章

最新更新