为什么pd.concat将结果类型从int更改为object?

时间:2018-12-24 16:13:51

标签: python pandas dataframe types concat

我正在使用Pandas解析多个csv文件,并将它们串联到一个大数据框中。然后,我要<div class="BigContainer"> <div class="MainListContainer"> <ul class="MainList"> <li class="MainListItem">List Option A</li> <li class="MainListItem selected">List Option B</li> <li class="MainListItem">List Option C</li> </ul> </div> <div class="SubListContainer"> <ul class="SubList"> <li class="SubListItem">Sub-Option 1</li> <li class="SubListItem">Sub-Option 2</li> <li class="SubListItem">Sub-Option 3</li> <li class="SubListItem">Sub-Option 4</li> <li class="SubListItem">Sub-Option 5</li> </ul> </div> </div>并计算groupby

这是一个示例数据框:

mean()

df1.head()

Time Node Packets 0 1 0 0 2 1 1 0 4 1 2 0 6 1 3 0 8 1 4 0

df1.info(verbose=True)

然后我将它们连接起来(为简单起见,将三个数据帧连接起来)

<class 'pandas.core.frame.DataFrame'>
Int64Index: 27972 entries, 0 to 55942
Data columns (total 3 columns):
Time       27972 non-null int64
Node       27972 non-null int64
Packets    27972 non-null int64
dtypes: int64(3)
memory usage: 874.1 KB
None

df_total = pd.concat([df1, df2, df3]) 产生

df_total.info(verbose=True)

最后,我尝试:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 83916 entries, 0 to 55942
Data columns (total 3 columns):
Time       83916 non-null object
Node       83916 non-null object
Packets    83916 non-null object
dtypes: object(3)
memory usage: 2.6+ MB
None

,这就是错误df_total = df_total.groupby(['Time'])['Packets'].mean() 出现的地方。

虽然我从诸如this之类的其他帖子中了解到,熊猫人由于pandas.core.base.DataError: No numeric types to aggregate而改变了dtype,但我无法用建议的解决方案解决问题。

我该如何解决?

2 个答案:

答案 0 :(得分:1)

我发现另一个post提到必须使用dtype初始化数据帧,否则它们的类型为object

Did you initialize an empty DataFrame first and then filled it? If so that's probably
why it changed with the new version as before 0.9 empty DataFrames were initialized 
to float type but now they are of object type. If so you can change the 
initialization to DataFrame(dtype=float).

所以我在代码中添加了df_total = pd.DataFrame(columns=['Time', 'Node', 'Packets'], dtype=int),它可以正常工作。

答案 1 :(得分:0)

 df_total.info(verbose=True)

您的这条语句将info作为对象,因此在连接中存在问题,每个值都不是int,因此对象的均值是不可能的。