groupby 和 agg 之后奇怪的是空的 DataFrame

Strangely empty DataFrame after groupby and agg

与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 来说更长,这是行不通的。我能够连接 DataFrame,但是当我进行分组和求和时,我收到一个空的 DataFrame。

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

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

我得到了想要的结果。

可能是因为您的组密钥不可哈希。试试转成string类型看看效果如何

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)    

与其说这对不是可散列的(它们是), 因为如果是这样,df1 会在创建过程中出错

是pandasgroupby排序,而Python无法排序int vs tuple vs str,所以改groupbygroupby('pair', sort=False) 应该可以解决问题

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

@Allen 的回答将 tuple 更改为 string,绕过了根本原因