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
,所以改groupby
到 groupby('pair', sort=False)
应该可以解决问题
pd.concat([df1, df2, df3]).\
groupby('pair', sort=False).\
sum()
@Allen 的回答将 tuple
更改为 string
,绕过了根本原因
与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
,所以改groupby
到 groupby('pair', sort=False)
应该可以解决问题
pd.concat([df1, df2, df3]).\
groupby('pair', sort=False).\
sum()
@Allen 的回答将 tuple
更改为 string
,绕过了根本原因