我有一个数据框df
,其中包含可以重复列Col
中的值的事务。我使用计数器dictionary1
计算每个Col
值的频率,然后我想对数据的子集运行for循环并获得值pit
。我想创建一个新词典dict1
,其中键是来自dictionary1
的键,值是pit
的值。这是我到目前为止的代码:
dictionary1 = Counter(df['Col'])
dict1 = defaultdict(int)
for i in range(len(dictionary1)):
temp = df[df['Col'] == dictionary1.keys()[i]]
b = temp['IsBuy'].sum()
n = temp['IsBuy'].count()
pit = b/n
dict1[dictionary1.keys()[i]] = pit
我的问题是,如何根据dict1
的密钥和dictionary1
计算得到的值为pit
分配密钥和值。换句话说,在上面的脚本中编写最后一行代码的正确方法是什么。
谢谢。
答案 0 :(得分:2)
由于您正在使用pandas
,我应该指出您遇到的问题很常见,因为它有一种内置的方法。我们称之为收集"类似的"将数据分组,然后对它们执行groupby
操作。阅读关于groupby split-apply-combine
成语的教程部分可能很糟糕 - 你可以做很多巧妙的事情!
计算pit
值的可行方法类似于
df.groupby("Col")["IsBuy"].mean()
例如:
>>> # make dummy data
>>> N = 10**4
>>> df = pd.DataFrame({"Col": np.random.randint(1, 10, N), "IsBuy": np.random.choice([True, False], N)})
>>> df.head()
Col IsBuy
0 3 False
1 6 True
2 6 True
3 1 True
4 5 True
>>> df.groupby("Col")["IsBuy"].mean()
Col
1 0.511709
2 0.495697
3 0.489796
4 0.510658
5 0.507491
6 0.513183
7 0.522936
8 0.488688
9 0.490498
Name: IsBuy, dtype: float64
如果您坚持,可以将其变成系列词典:
>>> df.groupby("Col")["IsBuy"].mean().to_dict()
{1: 0.51170858629661753, 2: 0.49569707401032703, 3: 0.48979591836734693, 4: 0.51065801668211308, 5: 0.50749063670411987, 6: 0.51318267419962338, 7: 0.52293577981651373, 8: 0.48868778280542985, 9: 0.49049773755656106}