2017-09-24 101 views
1

所以我一直在淘汰類似問題的解決方案,並保持擊中牆壁。我是python的新手,並且使用pandas/python作爲ETL,所以如果我沒有充分描述我的情況,請原諒我。Python,在另一列中計算值的發生頻率

我有兩個dataframes DF1的樣子:

Subscriber Key OtherID AnotherID 
1  'abc'   '12' '23' 
2  'bcd'   '45' '56' 
3  'abc'   '12' '23' 
4  'abc'   '12' '23' 
5  'cde'   '78' '90' 
6  'bcd'   '45' '56' 

DF2的樣子:

Subscriber Key OtherID AnotherID 
1  'abc'   '12' '23' 
2  'bcd'   '45' '56' 
3  'cde'   '78' '90' 

我試圖返回count次SubscriberKey數量: 'ABC' 發生在數據幀。找到值後,我想將計數附加到另一個數據幀(df2),這是我的第一個數據幀重複數據刪除。

它應該是這樣的:

Subscriber Key OtherID AnotherID Total Instances 
1  'abc'   '12' '23'   '3' 
2  'bcd'   '45' '56'   '1' 
3  'cde'   '78' '90'   '1' 

所以我所做的就是嘗試使用這行:

df1.groupby(['SubscriberKey']).size() 

我只用「SubscriberKey」的原因是因爲某些行只有該列填寫'OtherID'和'AnotherID'空白。

我也試過Series.value_count()。當我嘗試使用groupby和size()並將df2 ['Total Instances']的值設置爲出現次數時,看起來這些值沒有正確排列。

例如新表看起來是這樣的:

Subscriber Key OtherID AnotherID Total Instances 
1  'abc'   '12' '23'   '1' 
2  'bcd'   '45' '56'   '3' 
3  'cde'   '78' '90'   '2' 

所以我最初的想法是,也許做GROUPBY時,該功能可以自動排序我的輸出。我試圖通過將groupby'd表保存爲csv來檢查,並意識到它只打印count列而不打印相關的subscriberkey列。

無論如何,有沒有人有任何投入,我怎麼能做到這一點?重申一下,我想基本上只是向df2添加一個列,以返回df1中出現次數或實例總數。

謝謝!

回答

1

你可以試試:

df2['Total Instances'] = df2['Subscriber Key'].map(df1['Subscriber Key'].value_counts()) 
+1

嗨太感謝你了!這實現了我想要的。你能否澄清我的邏輯是否正確。本質上,您將我的重複數據幀(df2)映射回df1。所以我的第一個關鍵字,df2中的'abc',將被「綁定」到df1中的所有'abc'關鍵字中?然後在映射上調用一個計數? 對不起,只是試圖瞭解你的線路是如何工作的 – user6749426

+0

太棒了!很高興它有幫助。 'value_counts()'返回'Series',你想把它們映射到'Key'上的'df2'。請參考示例https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.map.html – 0p3n5ourcE

+0

所以我是: 1)創建一個字典,通過映射值在df1到df2在密鑰 2)使用.value_counts()調用一系列匹配值。 根據這篇文章,它看起來像我本質上是一個字典 – user6749426