2015-06-08 26 views
2

我有以下數據框:熊貓 - 標誌,當一個項目是不同的

date,   item,   value 
2015-01-20 abc   1 
2015-01-20 xyz   -1 
2015-01-20 fgh   1 
2015-01-20 iop   -1 
2015-01-21 abc   1 
2015-01-21 xyz   1 
2015-01-21 fgh   -1 
2015-01-21 iop   1 

我需要經過的每一天,標誌的項目,如果它是這一天具有不同的價值的唯一項目其餘的部分。他們可以有任何價值,關鍵是要確定每天只有一件物品與其他物品不同。

例如在2015-01-20兩個項目的值爲1,兩個項目的值爲-1,因此沒有任何標記。然而在2015-01-21,只有一個項目的值爲-1,其餘的值爲1,因此我需要標記項目'fgh'。

因此上述的輸出將是:

date,   item,   value flag 
2015-01-20 abc   1 
2015-01-20 xyz   -1 
2015-01-20 fgh   1 
2015-01-20 iop   -1 
2015-01-21 abc   1 
2015-01-21 xyz   1 
2015-01-21 fgh   -1  True 
2015-01-21 iop   1 

林不知道什麼建成大熊貓做到這一點?如果沒有,是否有一個合理的優雅的方式來完成這一點。

編輯

爲了簡化,我將能夠確保值列是正面或負面的意義,我將只需要找出當一個值爲正數,其餘均爲負,反之-versa。

+0

我會建議'DF [「標誌」] = df.groupby(「日期」)[「值」]變換(拉姆達X: x.value_counts()== 1) '但這不是我所期望的,看起來像這裏有一個錯誤 – EdChum

+0

嗯,看起來像我真的不得不在盒子外面想這麼做。 – darkpool

回答

1

你可以做的兩個步驟:

首先使用groupby得到你想要的聚合函數,在這種情況下,一個標誌,對每個日期和值:

singleton_values = (df.groupby(['date,','value'])['item,'].count()==1) 
singleton_values = singleton_values.reset_index() 
singleton_values.rename(columns = {'item,':'flag'}, inplace= True)   
singleton_values 

     date, value flag 
0 2015-01-20  -1 False 
1 2015-01-20  1 False 
2 2015-01-21  -1 True 
3 2015-01-21  1 False 

然後合併回到原來的數據幀已經顯示針對每一行的聚集體:

df = pd.merge(df,singleton_values) 
df 

     date, item, value flag 
0 2015-01-20 abc  1 False 
1 2015-01-20 fgh  1 False 
2 2015-01-20 xyz  -1 False 
3 2015-01-20 iop  -1 False 
4 2015-01-21 abc  1 False 
5 2015-01-21 xyz  1 False 
6 2015-01-21 iop  1 False 
7 2015-01-21 fgh  -1 True 
+0

謝謝,這看起來應該起作用。不幸的是,在嘗試重新命名時,我遇到了一個問題。 singleton_values的類型是因此我不能使用.rename。重命名僅適用於數據框,不適用於系列。真/假列沒有列名,所以我如何重命名它,然後將它合併回原始數據框?謝謝。 – darkpool

+0

對不起,我忘了一行(reset_index),代碼現在應該適合你。 – maxymoo

+0

非常好,謝謝你的幫助。 – darkpool

相關問題