2015-11-01 120 views
0

我有一個數據集是類似下面的設置後:找到獨特的列元素計數使用GROUPBY與熊貓

rows = [ 
    ('us', 0, 'ca', None, 94107, -100), 
    ('ca', 1, None, 'bc', 94107, -100), 
    ('us', 0, 'ca', None, 94106, 0), 
    ('us', 0, 'ca', None, 94107, 0), 
    ('ca', 1, None, 'bc', 94107, 0), 
    ('ca', 1, None, 'bc', 94107, 0), 
    ('us', 0, 'ca', None, 94107, 100), 
    ('us', 0, 'ca', None, 94107, 100) 
] 

我想GROUP BY:(country, state/provence, zip)然後找到Option列的罪名,分組完成後,最後轉換爲字典。

理想我想的字典格式化爲這樣的:

{ 
    ('us', 'ca', 94107): {100: 2, -100: 1, 0: 1}, 
    ('us', 'ca', 94106): {0: 1}, 
    ('ca', 'bc', 94107): {-100: 1, 0: 2} 
} 

我有下面的代碼至今:

# build the data frame 
df = pd.DataFrame(rows, columns=['Country', 'LocFilter', 'State', 'Provence', 'Zip', 'Option']) 

# consolidate "State" and "Provence" into "MainProvence" based on "LocFilter" 
df['MainProvence'] = df.apply(lambda row: (row['Provence'] if row['LocFilter'] == 1 else row['State']), axis=1) 

# group by and find distribution 
distribution = df.groupby(by=['Country', 'MainProvence','Zip', 'Option'])['Option'].count() 
# print the result 
print distribution 

這給了我以下 - 這看起來很不錯:

Country MainProvence Zip Option 
ca  bc   94107 -100  1 
           0  2 
us  ca   94106 0  1 
         94107 -100  1 
           0  1 
           100  2 
Name: Option, dtype: int64 

但是,當我將其轉換爲字典時:

print distribution.to_dict() 

我得到這個:

{ 
    ('us', 'ca', 94107, 100): 2, 
    ('us', 'ca', 94106, 0): 1, 
    ('us', 'ca', 94107, -100): 1, 
    ('ca', 'bc', 94107, 0): 2, 
    ('ca', 'bc', 94107, -100): 1, 
    ('us', 'ca', 94107, 0): 1 
} 

基於我怎麼形成的GROUPBY這是可以理解的。我明顯可以操縱python中的返回字典來獲取我想要的格式 - 但是有什麼方法可以使用pandas來獲取這種格式嗎?

回答

1

這很容易。嘗試:

distribution.unstack(level=['Option']).to_dict(orient='index') 

要獲得

{('ca', 'bc', 94107): {-100: 1.0, 0: 2.0, 100: nan}, 
('us', 'ca', 94106): {-100: nan, 0: 1.0, 100: nan}, 
('us', 'ca', 94107): {-100: 1.0, 0: 1.0, 100: 2.0}} 

我想丟棄nan不是應該過多在這一點上的不便。


PS。代替

df['MainProvence'] = df.apply(lambda row: (row['Provence'] if row['LocFilter'] == 1 else row['State']), axis=1) 

PPS

df['MainProvence'] = df['State'].fillna(df['Provence']) 

:考慮使用。您需要Pandas 0.17,才能在to_dict()內工作orient kwarg。

+0

工作很好!我還在學習熊貓,一定錯過了堆棧/堆棧。關於fillna的提示也很棒。並感謝包括版本說明,我不得不碰撞我的熊貓版本,然後它的工作很好。 – tknickman

+1

很高興爲您服務!即使在我的早期,我錯過了很多功能。我建議閱讀Pandas的文檔。它可能會變得無聊,所以趕快行動吧。 – Kartik