我有一个有两列的数据框架。我想删除这样的行:对于每一行,它只包含第一列中的一个实例,但包含第二列中的所有惟一值。
下面是一个例子:
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