我有一个df
带有事务的数据框,其中的列中的值Col
可以重复。我使用Counterdictionary1
来计数每个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
。换句话说,在上述脚本中编写最后一行代码的正确方法是什么。
谢谢你。
由于您正在使用pandas
,所以我应该指出,您面临的问题很常见,因此有内置的方法可以解决。我们称将“相似”数据收集到组中,然后对它们执行groupby
操作。阅读有关groupbysplit-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}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句