gpt4 book ai didi

python - 在列表列中删除重复的列表元素

转载 作者:行者123 更新时间:2023-12-02 11:26:03 26 4
gpt4 key购买 nike

这是我的数据框:

pd.DataFrame({'A':[1, 3, 3, 4, 5, 3, 3],
'B':[0, 2, 3, 4, 5, 6, 7],
'C':[[1,4,4,4], [1,4,4,4], [3,4,4,5], [3,4,4,5], [4,4,2,1], [1,2,3,4,], [7,8,9,1]]})
我想设置\删除每行C列的重复值,但不删除重复的行。
我希望得到的是:
pd.DataFrame({'A':[1, 3, 3, 4, 5, 3, 3],
'B':[0, 2, 3, 4, 5, 6, 7],
'C':[[1,4], [1,4], [3,4,5], [3,4,5], [4,2,1], [1,2,3,4,], [7,8,9,1]]})

最佳答案

如果您使用的是python 3.7>,则可以将 map dict.fromkeys结合使用,并从字典键中获取列表(该版本是相关的,因为从此处开始就一直保持插入顺序):

df['C'] = df.C.map(lambda x: list(dict.fromkeys(x).keys()))
对于较旧的python,您可以使用 collections.OrderedDict :
from collections import OrderedDict
df['c']= df.C.map(lambda x: list(OrderedDict.fromkeys(x).keys()))

print(df)

A B C
0 1 0 [1, 4]
1 3 2 [1, 4]
2 3 3 [3, 4, 5]
3 4 4 [3, 4, 5]
4 5 5 [4, 2, 1]
5 3 6 [1, 2, 3, 4]
6 3 7 [7, 8, 9, 1]
正如cs95在评论中提到的那样,如果我们不需要保留顺序,则可以使用 set来获得更简洁的方法:
df['c'] = df.C.map(lambda x: [*{*x}])

由于已经提出了几种方法,并且很难说出它们将如何在大型数据帧上执行,因此可能值得进行基准测试:
df = pd.concat([df]*50000, axis=0).reset_index(drop=True)

perfplot.show(
setup=lambda n: df.iloc[:int(n)],

kernels=[
lambda df: df.C.map(lambda x: list(dict.fromkeys(x).keys())),
lambda df: df['C'].map(lambda x: pd.factorize(x)[1]),
lambda df: [np.unique(item) for item in df['C'].values],
lambda df: df['C'].explode().groupby(level=0).unique(),
lambda df: df.C.map(lambda x: [*{*x}]),
],

labels=['dict.from_keys', 'factorize', 'np.unique', 'explode', 'set'],
n_range=[2**k for k in range(0, 18)],
xlabel='N',
equality_check=None
)
enter image description here

关于python - 在列表列中删除重复的列表元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62872266/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com