【问题标题】:Pandas Group By then Merge Using Multiple ColumnsPandas Group By 然后合并使用多列
【发布时间】:2019-06-05 03:19:26
【问题描述】:

我对 Pandas 很陌生,但我正在尝试分析员工时间戳数据集,以确定每周唯一每日时间戳的总和。

我的初始数据框 (input1) 如下所示(但更长):

            ID          Datetime        Week/Year
0          15.0    2019-02-04 08:28:44   6/2019
1          15.0    2019-02-04 12:48:05   6/2019
2          15.0    2019-02-04 12:54:29   6/2019
3          15.0    2019-02-05 08:05:51   6/2019
4          15.0    2019-02-05 12:47:26   6/2019
5          15.0    2019-02-05 14:45:34   6/2019
6          15.0    2019-02-06 08:10:59   6/2019
7          15.0    2019-02-06 12:49:24   6/2019
8          15.0    2019-02-06 13:02:48   6/2019
9          15.0    2019-02-07 08:02:22   6/2019
10         15.0    2019-02-08 08:02:10   6/2019
11         15.0    2019-02-08 09:55:22   6/2019

我创建了另一个数据框:

df = pd.DataFrame({'Timestamp':  input1['Datetime'], 'ID': input1['ID'], 'Week/Year': input1['Week/Year'],'MDY':input1['Server Date/Time'].apply(lambda x: "%d/%d/%d" % (x.month, x.day, x.year))})

然后我按周、员工分组,并得到每天的唯一计数 (MDY):

df_grouped = df.groupby(['Week/Year', 'ID']).MDY.nunique()

Week/Year   ID    MDY 
6/2019      15.0   5

我正在寻找的最终结果是通过加入 Week 和 ID 将 MDY 总和合并回初始数据帧 - 我尝试了几种不同的方法:

input1.merge(df_grouped.to_frame(), left_on=['ID','Week/Year'], right_index=True)

得到类似的东西:

           ID          Datetime        Week/Year    MDY
0          15.0    2019-02-04 08:28:44   6/2019    5
1          15.0    2019-02-04 12:48:05   6/2019    5
2          15.0    2019-02-04 12:54:29   6/2019    5
3          15.0    2019-02-05 08:05:51   6/2019    5
4          15.0    2019-02-05 12:47:26   6/2019    5
5          15.0    2019-02-05 14:45:34   6/2019    5

加入后,我最终得到了全面的 NaN。谁能引导我朝着正确的方向前进?

谢谢。

【问题讨论】:

  • 最有可能是列名问题。在某些时候您说input1 列是IDDatetime,在其他时候您将它们用作WD: Employee IDServer Date/Time。一旦保持一致,您的代码就会生成预期的数据帧。
  • 这是我在转置/混淆数据时的拼写错误。感谢您指出。

标签: python pandas


【解决方案1】:

这个groupby

df_grouped = df.groupby(['Week/Year', 'WD: Employee ID']).MDY.nunique()

应该返回一个索引为Week/Year WD: Employee ID的系列

Week/Year   WD: Employee ID
6/2019      15.0   5
Name: MDY , dtype: int64

但是,您将其索引显示为Week/Year ID。您可以检查列名称以确保它匹配。

接下来,关于这个

input1.merge(df_grouped.to_frame(), left_on=['ID','Week/Year'], right_index=True)

假设df_grouped 具有您在示例中显示的索引Week/Year ID,则您的left_onright_index 的顺序错误。应该是

input1.merge(df_grouped.to_frame(), left_on=['Week/Year', 'ID'], right_index=True)

【讨论】:

  • 第一个问题实际上只是转置以混淆数据的错字,但问题是 left_on 的顺序。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多