我想用大熊猫做一些与

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。

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

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


我得到了预期的结果。

最佳答案

这对不是不可散列的(它们是),
因为如果是这种情况,df1在创建期间会给出错误

这是熊猫groupby排序的事实,Python无法对int vs tuple vs str进行排序,因此将groupby更改为groupby('pair', sort=False)应该可以解决问题

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


@Allen的答案将tuple更改为string,从而避免了根本原因

关于python - groupby和agg之后奇怪地清空DataFrame,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44069274/

10-14 19:54
查看更多