在groupby和agg之后奇怪地清空DataFrame

时间:2017-05-19 11:46:35

标签: python pandas pandas-groupby

使用pandas我想做一些与

非常相似的事情
import pandas as pd

dict1 = {((('Message1',),('Message1','Message4',)),('Message4',)): 10}
dict2 = {(1677, 468): 3}
dict3 = {(1677, 468): 1, (2078, 869): 1 }

df1 = pd.DataFrame.from_dict(dict1, orient='index'). \
    reset_index(). \
    rename(columns={'index': 'pair', 0: 'pair_count'})

df2 = pd.DataFrame.from_dict(dict2, orient='index'). \
    reset_index(). \
    rename(columns={'index': 'pair', 0: 'pair_count'})

df3 = pd.DataFrame.from_dict(dict3, orient='index'). \
    reset_index(). \
    rename(columns={'index': 'pair', 0: 'pair_count'})

pd.concat([df1, df2, df3]).\
    groupby('pair').\
    sum()

如果你运行上面的代码,这应该工作。然而,对于我的数据,它看起来非常相似,但在dict2和dict3方面更长,这不起作用。我能够连接DataFrames,但是当我进行分组和总和时,我收到一个空的DataFrame。

不幸的是,当我尝试通过提取数据来重现错误时,这确实有效。 (这就是为什么我无法发布错误发生的例子。)所以我猜这个问题不是关于数据本身...也许,因为这是最奇怪的事情:如果我将dict1更改为

dict1 = {((('Message1',),('Message1',)),('Message4',)): 10}

我得到了理想的结果。

2 个答案:

答案 0 :(得分:2)

并不是说这对不可以(他们是), 因为如果是这种情况,df1会在创建过程中出错

事实上,pandas groupby排序,而Python无法对inttuple vs str进行排序,因此更改{{1} }} groupby应该做的伎俩

groupby('pair', sort=False)

@ Allen的回答将pd.concat([df1, df2, df3]).\ groupby('pair', sort=False).\ sum() 更改为tuple,从而避免了根本原因

答案 1 :(得分:1)

可能因为您的群组密钥不可删除。尝试将其转换为字符串类型以查看它是如何发生的。

df4 = pd.concat([df1, df2, df3])
df4.groupby(df4.pair.astype(str)).sum()
Out[251]: 
                                                    pair_count
pair                                                          
((('Message1',), ('Message1', 'Message4')), ('M...          10
(1677, 468)                                                  4
(2078, 869)    
相关问题