【问题标题】:Aggregating Values for a specific ID in a Dataframe in Python在 Python 的数据框中聚合特定 ID 的值
【发布时间】:2018-06-22 10:30:26
【问题描述】:

如果我有一个数据框,例如

id     quantity     date
 1     2.0          6-12-18
 1     3.0          6-20-18
 1     3.0          6-22-18
 1     1.0          5-12-18
 2     5.0          6-10-18
 2     1.0          6-15-18
 2     1.0          6-11-18
 3     4.0          7-10-18
 3     4.0          7-15-18
 3     4.0          7-16-18

我想找到与特定 id 关联的“数量”列值的偏差。

我在想我可以聚合与特定 ID 关联的数量值并按日期排序数量值,并从为每个 ID 创建的整数列表中消除重复项。我的想法是使用 df.groupby 或者 pd.series.unique

目标是它看起来像这样:

id     quantity                 date
 1     1.0, 3.0, 3.0, 2.0       5-12-18, 6-12-18, 6-20-18, 6-22-18 
 2     5.0, 1.0, 1.0            6-10-18, 6-11-18, 6-15-18
 3     4.0, 4.0, 4.0            7-10-18, 7-15-18, 7-16-18       

然后我想在数据框中创建一个新列,它会说明数量值是增加、减少还是保持不变,所以它看起来像这样:

id     quantity                 trend
 1     1.0, 3.0, 3.0, 2.0       inc, same, dec 
 2     5.0, 1.0, 1.0            dec, same
 3     4.0, 4.0, 4.0            same 

谢谢:)

【问题讨论】:

  • 我无法将输出与您的输入 df 匹配,您要检查吗?例如第一行
  • 日期不正常,所以我希望实现的一件事是按日期订购数量值(这就是输出以 1.0 开头的原因,因为 id 的数量为 1.0 #1 on 5-12-2018 [它在输入 df 的第 4 行]) - 谢谢!

标签: python pandas dataframe group-by pandas-groupby


【解决方案1】:

输入 (df)

   id  quality       date
0   1      2.0 2018-06-12
1   1      3.0 2018-06-20
2   1      3.0 2018-06-22
3   1      1.0 2018-05-12
4   2      5.0 2018-06-10
5   2      1.0 2018-06-15
6   2      1.0 2018-06-11
7   3      4.0 2018-07-10
8   3      4.0 2018-07-15
9   3      4.0 2018-07-16

代码

# date column (lists)
df0 = df.groupby('id')['date'].apply(list).reset_index(drop=False)

# quality column (lists)
df1 = df.groupby('id')['quality'].apply(list).reset_index(drop=False)

# trend column (lists)
df['delta'] = df.quality.diff(1)
df.loc[df.delta > 0, 'trend'] = 'inc'
df.loc[df.delta == 0, 'trend'] = 'same'
df.loc[df.delta < 0, 'trend'] = 'dec'
df2 = df.groupby('id')['trend'].apply(list).apply(lambda x: x[1:]).reset_index(drop=False)

# merge all
df3 = pd.merge(df1, df0, on='id', how='left')
df3 = pd.merge(df3, df2, on='id', how='left')

# remove brackets
df3['quality'] = df3.quality.apply(lambda x: ", ".join(repr(e) for e in x))
df3['date'] = df3.date.apply(lambda x: ", ".join(x))
df3['trend'] = df3.trend.apply(lambda x: ", ".join(x))

输出 (df3)

    id  quality             date                    trend
0   1   2.0, 3.0, 3.0, 1.0  6-12-18, 6-20-18, ...   inc, same, dec
1   2   5.0, 1.0, 1.0       6-10-18, 6-15-18, ...   dec, same
2   3   4.0, 4.0, 4.0       7-10-18, 7-15-18, ...   same, same

【讨论】:

  • 很好地使用 .apply(list)。我会把我的拿下来
猜你喜欢
  • 2019-01-09
  • 2021-06-01
  • 1970-01-01
  • 2020-02-26
  • 2023-02-07
  • 1970-01-01
  • 2020-07-08
  • 2020-08-14
  • 2021-06-16
相关资源
最近更新 更多