Pandas drop_duplicates。保持第一个和最后一个。可能吗?
Pandas drop_duplicates. Keep first AND last. Is it possible?
我有这个数据框,我需要删除所有重复项,但我需要保留第一个和最后一个值
例如:
1 0
2 0
3 0
4 0
输出:
1 0
4 0
我试过了df.column.drop_duplicates(keep=("first","last"))
但是它没有字,它returns
ValueError: keep must be either "first", "last" or False
有人知道这件事的转机吗?
谢谢
您可以使用 panda's concat 函数创建包含第一个值和最后一个值的数据框。
pd.concat([
df['X'].drop_duplicates(keep='first'),
df['X'].drop_duplicates(keep='last'),
])
在名为 column
的列上使用 groupby,然后重新编制索引。如果您想检查多个列中的重复值,您可以扩展包含在 groupby 中的列。
df = pd.DataFrame({'column':[0,0,0,0]})
输入:
column
0 0
1 0
2 0
3 0
df.groupby('column', as_index=False).apply(lambda x: x if len(x)==1 else x.iloc[[0, -1]]).reset_index(level=0, drop=True)
输出:
column
0 0
3 0
你不能同时删除 first 和 last...所以技巧是连接 first 和 last 的数据帧。
当你连接时,必须处理创建非重复项的副本。所以只在第二个数据框中连接唯一索引。 (不确定 Merge/Join 是否会更好?)
import pandas as pd
d = {1:0,2:0,10:1, 3:0,4:0}
df = pd.DataFrame.from_dict(d, orient='index', columns=['cnt'])
print(df)
cnt
1 0
2 0
10 1
3 0
4 0
然后这样做:
d1 = df.drop_duplicates(keep=("first"))
d2 = df.drop_duplicates(keep=("last"))
d3 = pd.concat([d1,d2.loc[set(d2.index) - set(d1.index)]])
d3
Out[60]:
cnt
1 0
10 1
4 0
我有这个数据框,我需要删除所有重复项,但我需要保留第一个和最后一个值
例如:
1 0
2 0
3 0
4 0
输出:
1 0
4 0
我试过了df.column.drop_duplicates(keep=("first","last"))
但是它没有字,它returns
ValueError: keep must be either "first", "last" or False
有人知道这件事的转机吗?
谢谢
您可以使用 panda's concat 函数创建包含第一个值和最后一个值的数据框。
pd.concat([
df['X'].drop_duplicates(keep='first'),
df['X'].drop_duplicates(keep='last'),
])
在名为 column
的列上使用 groupby,然后重新编制索引。如果您想检查多个列中的重复值,您可以扩展包含在 groupby 中的列。
df = pd.DataFrame({'column':[0,0,0,0]})
输入:
column
0 0
1 0
2 0
3 0
df.groupby('column', as_index=False).apply(lambda x: x if len(x)==1 else x.iloc[[0, -1]]).reset_index(level=0, drop=True)
输出:
column
0 0
3 0
你不能同时删除 first 和 last...所以技巧是连接 first 和 last 的数据帧。
当你连接时,必须处理创建非重复项的副本。所以只在第二个数据框中连接唯一索引。 (不确定 Merge/Join 是否会更好?)
import pandas as pd
d = {1:0,2:0,10:1, 3:0,4:0}
df = pd.DataFrame.from_dict(d, orient='index', columns=['cnt'])
print(df)
cnt
1 0
2 0
10 1
3 0
4 0
然后这样做:
d1 = df.drop_duplicates(keep=("first"))
d2 = df.drop_duplicates(keep=("last"))
d3 = pd.concat([d1,d2.loc[set(d2.index) - set(d1.index)]])
d3
Out[60]:
cnt
1 0
10 1
4 0