Grouper() 和 agg() 函数在压缩时生成多个副本

Grouper() and agg() functions produce multiple copies when squashed

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

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 

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

尝试:

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'。

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

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

>>> 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

在您的情况下,将 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