2015-11-01 79 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