合并数据框导致行丢失

时间:2019-09-12 19:40:24

标签: python-3.x pandas

我有一个数据框,在该数据框上我分为3个子数据框。然后,我将应用聚合函数。之后,我合并了三个数据框。

但是,当比较合并之前和合并之后的行数时,尽管我使用命令来填充空格以保留行数,但它显示出明显的损失。我认为聚合代码可以修剪所有内容。也许有一种更好的方式来编写代码的那部分,它将修复其余部分。

In: df.info()
Out:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 505960 entries, 640051 to 204623
Data columns (total 4 columns):
id             505960 non-null int64
session_number 505960 non-null int64
date           505960 non-null datetime64[ns]
purchases      505960 non-null int64
dtypes: datetime64[ns](1), int64(3)
memory usage: 19.3 MB

In: df.shape
Out: (505960, 4)

In: 
#slice main dataframe
df_test=df[['id','purchases','session_number','date']].copy()

#aggregations I THINK HERE IS THE PROBLEM SOURCE!
df_1=df_test.groupby(['id'])["purchases"].apply(lambda x : x.astype(int).sum()).reset_index()
df_2=df_test.groupby(['id'])["session_number"].apply(lambda y : y.max()-y.min()).astype(int).reset_index()
df_3=df_test.groupby(['id'])["date"].apply(lambda z : z.max()-z.min()).reset_index()

#merge dfs sequentially by id
df_a=pd.merge(df_1, df_2, on='id', how='left').fillna(0)
df=pd.merge(df_a, df_3, on='id', how='left').fillna(0)

in: df.shape
Out: (292291, 4)

您可以看到我的行从505,960缩小到292,291!我的代码聚合部分在做什么以及如何解决?

2 个答案:

答案 0 :(得分:1)

通过查看给定的代码和有关数据的元数据信息,groupby会将具有相同ID的记录聚合到单个GroupBy对象中,因此,如果ID为,记录总数将减少不是唯一的。 唯一 ID的计数应与groupby之后的最终记录数相同。

df['id'].nunique()将为您提供唯一ID的数量,该数量应与您的最终数量相符。

答案 1 :(得分:0)

执行df_test.groupby(['id'])时,它将生成一个GroupBy对象,并将组密钥设置为索引an,在这种情况下为“ id”。

因此,请执行以下操作:

df_a = df_1.merge(df_2, left_index = True, right_index =True).fillna(0)
df = df_a.merge(df_3, left_index = True, right_index =True).fillna(0)