在Python中初始化一个字典列表并更新其值

3
我有以下数据框:
user | speed
------------
Anna | 1.0
Bell | 1.2
Anna | 1.3
Chad | 1.5
Bell | 1.4
Anna | 1.1

我想使用一个字典来记录每个用户的相遇次数,并在循环遍历数据帧时更新他/她的速度。
例如,第一次看到“Anna”时,字典如下:
{"Anna": [1, 1.0]}

第二次我们看到“Anna”时,它变成了:
{"Anna": [2, 1.3], "Bell": [1, 1.2]}

最终,这个字典应该是:
{"Anna": [3, 1.1], "Bell": [2, 1.4], "Chad": [1, 1.5]}

计数部分很容易:
>>> import pandas as pd
>>> record = pd.DataFrame({"user": ("Anna", "Bell", "Anna", "Chad", "Bell", "Anna"), "speed": (1.0, 1.2, 1.3, 1.5, 1.4, 1.1)})
>>> record
   speed  user
0    1.0  Anna
1    1.2  Bell
2    1.3  Anna
3    1.5  Chad
4    1.4  Bell
5    1.1  Anna
>>> encounter = {}
>>> for i in record['user']:
...   encounter[i] = encounter.get(i, 0) + 1
...
>>> encounter
{'Anna': 3, 'Bell': 2, 'Chad': 1}

但是创建一个空字典列表并更新第二个值的好方法是什么?谢谢!
3个回答

6
我认为您想要在两行内完成此操作。
import pandas as pd

record = pd.DataFrame({
  "user": ("Anna", "Bell", "Anna", "Chad", "Bell", "Anna"), 
  "speed": (1.0, 1.2, 1.3, 1.5, 1.4, 1.1)
})

encounter = {}
for name, value in zip(record["user"], record["speed"]):
  encounter[name] = [encounter.get(name, [0])[0] + 1, value]
  1. zip方法可以同时遍历名称和速度。
  2. get方法尝试获取记录,如果不存在,则返回列表[0]
  3. 第二个[0]取出列表的第一个元素,即计数器。
  4. 最后将其与新值组合成一个新列表,并分配给encounter[name]

2

使用 collections.Counter

例子:

import pandas as pd
from decimal import Decimal
from collections import Counter

record = pd.DataFrame({"user": ("Anna", "Bell", "Anna", "Chad", "Bell", "Anna"), "speed": (1.0, 1.2, 1.3, 1.5, 1.4, 1.1)})

encounter = {}
for k,v in Counter(record["user"].tolist()).items():
    encounter[k] = [v, (record[record["user"] == k]["speed"].iloc[-1]).round(1).astype(Decimal)]

print(encounter)

输出:

{'Anna': [3, 1.1], 'Chad': [1, 1.5], 'Bell': [2, 1.4]}

尝试以上代码时,为什么速度值会随着更多小数位而改变?{'Anna': [3,1.1000000000000001],'Bell': [2,1.3999999999999999],'Chad': [1,1.5]} - Aneesh Damodaran
1
@AneeshDamodaran。我不确定为什么.. 但可以通过使用 df.roundDecimal 进行修复。 - Rakesh

1

跟随 pandorable

my_dictionary={}
for k, v in df.groupby('user'):
    my_dictionary[k]=[len(v),v.iloc[-1]['speed']]
print(my_dictionary)
{'Anna': [3, 1.1], 'Bell': [2, 1.4], 'Chad': [1, 1.5]}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接