使用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}
我得到了理想的结果。
答案 0 :(得分:2)
并不是说这对不可以(他们是),
因为如果是这种情况,df1
会在创建过程中出错
事实上,pandas groupby
排序,而Python无法对int
与tuple
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)