通过包含另一个组的第一个值来进行数据框分组

发布于 2025-01-10 11:29:33 字数 1116 浏览 0 评论 0原文

这是我的简化示例数据框:

  timestamp   A  B  C

1422404668   1   1  2
1422404670   2   2  3
1422404672  -3   3  4
1422404674  -4   4  5
1422404676   5   5  6
1422404678  -6   6  7
1422404680  -7   7  8
1422404680   8   8  9

有没有一种方法可以按正值和负值进行分组,并获取 A 列中每个组的第一个值、B 列的平均值(包括下一组的第一个值)以及下一个组的第一个值之间的差列 C 的组和当前组的第一个值如下输出

预期输出:

timestamp    A  B     C
1422404668   1  2     2
1422404672  -3  4     2
1422404676   5  5.5   1
1422404678  -6  7     2
1422404680   8  8     9

数据:

{'timestamp': [1422404668, 1422404670, 1422404672, 1422404674,
  1422404676, 1422404678, 1422404680, 1422404680],
 'A': [1, 2, -3, -4, 5, -6, -7, 8], 'B': [1, 2, 3, 4, 5, 6, 7, 8], 'C': [2, 3, 4, 5, 6, 7, 8, 9]}

我使用下面的代码来获取组依据、平均值和组中的差异,但如何将下一组的第一个值包含在平均差异中(B 栏和 C 栏)

m=df['A'].lt(0)
df.groupby(m.ne(m.shift()).cumsum()).agg(
            {'timestamp': 'first',
             A: 'first',
             B: 'mean',
             C: lambda x: x.iat[-1]-x.iat[0] if len(x) > 1 else x.iat[0]
             }).reset_index(drop=True)

Here is my simplified example dataframe:

  timestamp   A  B  C

1422404668   1   1  2
1422404670   2   2  3
1422404672  -3   3  4
1422404674  -4   4  5
1422404676   5   5  6
1422404678  -6   6  7
1422404680  -7   7  8
1422404680   8   8  9

Is there a way to group by positive and negative values and get first value of each group in column A, mean values of column B (including the first value of next group) and difference between first value of next group and first value of current group for column C as below output

Expected output:

timestamp    A  B     C
1422404668   1  2     2
1422404672  -3  4     2
1422404676   5  5.5   1
1422404678  -6  7     2
1422404680   8  8     9

Data:

{'timestamp': [1422404668, 1422404670, 1422404672, 1422404674,
  1422404676, 1422404678, 1422404680, 1422404680],
 'A': [1, 2, -3, -4, 5, -6, -7, 8], 'B': [1, 2, 3, 4, 5, 6, 7, 8], 'C': [2, 3, 4, 5, 6, 7, 8, 9]}

I'm using the below code to get group by and mean values and difference in the group but how to include the first value of next group in mean difference (column B and C)

m=df['A'].lt(0)
df.groupby(m.ne(m.shift()).cumsum()).agg(
            {'timestamp': 'first',
             A: 'first',
             B: 'mean',
             C: lambda x: x.iat[-1]-x.iat[0] if len(x) > 1 else x.iat[0]
             }).reset_index(drop=True)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

顾忌 2025-01-17 11:29:33

对于聚合 mean 还包括下一个第一个值聚合 sumsizefirst 以及计数 meanfirst 进行聚合后,以类似的方式获取 C 的差异第一个值:

m=df['A'].lt(0)
df = df.groupby(m.ne(m.shift()).cumsum()).agg(
            {'timestamp': 'first',
             'A': 'first',
             'B':['sum','size','first'],
             'C':'first'})
df.columns = df.columns.map('_'.join)

df['B'] = (df['B_sum'].add(df['B_first'].shift(-1))
                      .div(df['B_size'].add(1))
                      .fillna(df['B_first']))
df['C'] = (df['C_first'].shift(-1)
                        .sub(df['C_first'])
                        .fillna(df['C_first']))
print (df)
   timestamp_first  A_first  B_sum  B_size  B_first  C_first    B    C
A                                                                     
1       1422404668        1      3       2        1        2  2.0  2.0
2       1422404672       -3      7       2        3        4  4.0  2.0
3       1422404676        5      5       1        5        6  5.5  1.0
4       1422404678       -6     13       2        6        7  7.0  2.0
5       1422404680        8      8       1        8        9  8.0  9.0

df = (df[['timestamp_first','A_first','B', 'C']]
              .rename(columns={'timestamp_first':'timestamp','A_first':'A'}))
print (df)
    timestamp  A    B    C
A                         
1  1422404668  1  2.0  2.0
2  1422404672 -3  4.0  2.0
3  1422404676  5  5.5  1.0
4  1422404678 -6  7.0  2.0
5  1422404680  8  8.0  9.0

For aggregate mean also include next first value aggregate sum, size and first and count mean affter aggragation with shifted values first and similar way get difference first values of C:

m=df['A'].lt(0)
df = df.groupby(m.ne(m.shift()).cumsum()).agg(
            {'timestamp': 'first',
             'A': 'first',
             'B':['sum','size','first'],
             'C':'first'})
df.columns = df.columns.map('_'.join)

df['B'] = (df['B_sum'].add(df['B_first'].shift(-1))
                      .div(df['B_size'].add(1))
                      .fillna(df['B_first']))
df['C'] = (df['C_first'].shift(-1)
                        .sub(df['C_first'])
                        .fillna(df['C_first']))
print (df)
   timestamp_first  A_first  B_sum  B_size  B_first  C_first    B    C
A                                                                     
1       1422404668        1      3       2        1        2  2.0  2.0
2       1422404672       -3      7       2        3        4  4.0  2.0
3       1422404676        5      5       1        5        6  5.5  1.0
4       1422404678       -6     13       2        6        7  7.0  2.0
5       1422404680        8      8       1        8        9  8.0  9.0

df = (df[['timestamp_first','A_first','B', 'C']]
              .rename(columns={'timestamp_first':'timestamp','A_first':'A'}))
print (df)
    timestamp  A    B    C
A                         
1  1422404668  1  2.0  2.0
2  1422404672 -3  4.0  2.0
3  1422404676  5  5.5  1.0
4  1422404678 -6  7.0  2.0
5  1422404680  8  8.0  9.0
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文