gpt4 book ai didi

python - 更新重复项的更快方法

转载 作者:太空宇宙 更新时间:2023-11-04 01:51:26 24 4
gpt4 key购买 nike

我的目标是更新重复的一列,但只更新第二列+(第一列应该保持不变),例如:

df_示例:

    Name    val1     val2     val3   
0 AAA 11 3 1
1 AAA 22 3 1
2 BBB 33 2 2
3 CCC 44 3 3
4 DDD 55 2 4
5 DDD 66 2 4
6 DDD 77 3 4

预期的输出是:

    Name  val1   val2     val3   
0 AAA 11 3 1
1 AAA 22 3 0
2 BBB 33 2 2
3 CCC 44 3 3
4 DDD 55 2 4
5 DDD 66 2 0
6 DDD 77 3 4 ( unchanged because Val2 is different )

我目前正在使用 iterrows(我知道这是最糟糕的选择,但我找不到更好的选择):

list = []
for index, row in df.iterrows():

if (row['Name']+row['val2'] in list): # Check for Name + Val2
row['val3'] = '0'
list.append(row['Name']+row['val2']) # Inserts the new Name+Val2 in the list , next time
#this combination appears will fall in the if statement

对于不太小的数据集(~ 1MM 行),这需要大约 20 分钟......太多了

谢谢,

最佳答案

您可以使用 df[['Name', 'val2']].duplicated() 创建一系列 bool 来确定组合是否已经存在展示。然后我们可以使用该掩码来设置 val3` 列的值:

df.loc[df[['Name', 'val2']].duplicated(), 'val3'] = 0

对于给定的样本数据,这给了我们:

>>> df = pd.DataFrame({'Name': ['AAA', 'AAA', 'BBB', 'CCC', 'DDD', 'DDD', 'DDD'], 'val1': [11,22,33,44,55,66,77], 'val2': [3,3,2,3,2,2,3], 'val3': [1,1,2,3,4,4,4]})
>>> df
Name val1 val2 val3
0 AAA 11 3 1
1 AAA 22 3 1
2 BBB 33 2 2
3 CCC 44 3 3
4 DDD 55 2 4
5 DDD 66 2 4
6 DDD 77 3 4
>>> df.loc[df[['Name', 'val2']].duplicated(), 'val3'] = 0
>>> df
Name val1 val2 val3
0 AAA 11 3 1
1 AAA 22 3 0
2 BBB 33 2 2
3 CCC 44 3 3
4 DDD 55 2 4
5 DDD 66 2 0
6 DDD 77 3 4

如果我们将样本数据帧中的记录数重复 200'000 次,然后运行上面的命令一百次,我们将获得以下基准:

>>> df = pd.DataFrame({'Name': ['AAA', 'AAA', 'BBB', 'CCC', 'DDD', 'DDD', 'DDD']*200000, 'val1': [11,22,33,44,55,66,77]*200000, 'val2': [3,3,2,3,2,2,3]*200000, 'val3': [1,1,2,3,4,4,4]*200000})
>>> def f():
... df.loc[df[['Name', 'val2']].duplicated(), 'val3'] = 0
...
>>> from timeit import timeit
>>> timeit(f, number=100)
11.420697326015215

对于具有 1.4M 行的数据帧,我们因此可以平均在 0.1142 秒内完成处理。

关于python - 更新重复项的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57939285/

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