【问题标题】:Grouper() and agg() functions produce multiple copies when squashedGrouper() 和 agg() 函数在压缩时会产生多个副本
【发布时间】:2021-12-06 13:47:56
【问题描述】:

我有一个示例数据框,如下所示。

import pandas as pd
import numpy as np

NaN = np.nan
data = {'ID':['A', 'A', 'A', 'B','B','B'],
'Date':['2021-09-20 04:34:57', '2021-09-20 04:37:25', '2021-09-20 04:38:26', '2021-09-01 
 00:12:29','2021-09-01 11:20:58','2021-09-02 09:20:58'],
'Name':['xx','xx',NaN,'yy',NaN,NaN],
'Height':[174,174,NaN,160,NaN,NaN],
'Weight':[74,NaN,NaN,58,NaN,NaN],
'Gender':[NaN,'Male',NaN,NaN,'Female',NaN],
'Interests':[NaN,NaN,'Hiking,Sports',NaN,NaN,'Singing']}

df1 = pd.DataFrame(data)
df1 

我想将同一日期的数据合并到一行中。 “日期”列采用时间戳格式。我已经为它写了一个代码。这是我的 TRY 代码:

试试:

df1['Date'] = pd.to_datetime(df1['Date'])

df_out = (df1.groupby(['ID', pd.Grouper(key='Date', freq='D')])
         .agg(lambda x: ''.join(x.dropna().astype(str)))
         .reset_index()
     ).replace('', np.nan)

这给出了一个输出,如果有多个相同值的条目,最终结果在同一行中有多个条目,如下所示。

获得的输出 但是,如果有多个条目,我不希望重复这些值。最终输出应如下图所示。

所需输出

第一列不应有 'xx' 和 174.0 而不是 'xxxx' 和 '174.0 174.0'。

非常感谢任何帮助。谢谢。

【问题讨论】:

  • str.join 聚合似乎不适用于许多列。如果您希望信息是静态的,只是在缺失方面有所不同,那么您应该将first 用于姓名、年龄、体重、性别等列。但是,如果存在数据质量问题,您可能希望使用 modal 值来解决它。那么'Interests' 将是您的唯一列','.join

标签: python pandas dataframe data-science data-processing


【解决方案1】:

在您的情况下,将 agg join 替换为 first

df_out = (df1.groupby(['ID', pd.Grouper(key='Date', freq='D')])
         .first()
         .reset_index()
     ).replace('', np.nan)
df_out
Out[113]: 
  ID       Date  Name  Height  Weight  Gender      Interests
0  A 2021-09-20    xx   174.0    74.0    Male  Hiking,Sports
1  B 2021-09-01    yy   160.0    58.0  Female           None
2  B 2021-09-02  None     NaN     NaN    None        Singing

【讨论】:

    【解决方案2】:

    由于您只是想为每个日期的每列保留第一个可用值,您可以这样做:

    >>> df1.groupby(["ID", pd.Grouper(key='Date', freq='D')]).agg("first").reset_index()
    
      ID       Date  Name  Height  Weight  Gender      Interests
    0  A 2021-09-20    xx   174.0    74.0    Male  Hiking,Sports
    1  B 2021-09-01    yy   160.0    58.0  Female           None
    2  B 2021-09-02  None     NaN     NaN    None        Singing
    

    【讨论】:

      猜你喜欢
      • 2019-01-03
      • 1970-01-01
      • 2015-09-23
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      • 2013-07-27
      • 2023-03-11
      相关资源
      最近更新 更多