2014-11-23 5 views
1

Col 열의 값을 반복 할 수있는 트랜잭션이있는 데이터 프레임 df이 있습니다. 나는 각 Col 값에 대한 주파수를 계산하기 위해 카운터 dictionary1을 사용합니다. 그런 다음 데이터의 서브 세트에서 for 루프를 실행하고 값 pit을 얻고 싶습니다. 키가 dictionary1이고 값이 pit 인 새로운 사전 dict1을 만들고 싶습니다.Python의 다른 사전에서 고유 키와 값을 복사하는 방법

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 

내 질문은, 내가 dictionary1의 키와 pit의 계산에서 얻은 값에 따라 dict1의 키와 값을 할당 할 수있는 방법이 내가 지금까지 가지고있는 코드입니다. 즉, 위의 스크립트에서 마지막 줄의 코드를 작성하는 올바른 방법은 무엇입니까?

감사합니다.

답변

2

pandas을 사용하고 있으므로 현재 직면하고있는 문제는 일반적으로 수행 할 수있는 기본 방법이라는 것을 지적해야합니다. "유사한"데이터를 그룹으로 수집 한 다음 작업을 수행합니다 (groupby). groupby split-apply-combine 관용구에 대한 튜토리얼 섹션을 읽는 것은 어리석은 일입니다. 할 수있는 일들이 많이 있습니다!

예를 들어

df.groupby("Col")["IsBuy"].mean() 

같을 것이다 pit 값을 계산하는 pandorable 방법 : 당신이 주장하는 경우가 시리즈에서 사전에 돌 수 있었다

>>> # 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} 
+0

감사합니다. @DSM! 이것은 완벽하게 작동했기 때문에 for 루프를 수행 할 필요가 없습니다. – roland

관련 문제