gpt4 book ai didi

python - Pandas Dataframe 分成 session

转载 作者:太空狗 更新时间:2023-10-29 22:31:02 26 4
gpt4 key购买 nike

这是我的 question 的扩展.

为了让它更简单让我们假设我有一个 pandas 数据框,如下所示。

df = pd.DataFrame([[1.1, 1.1, 2.5, 2.6, 2.5, 3.4,2.6,2.6,3.4], list('AAABBBBAB'), [1.1, 1.7, 2.5, 2.6, 3.3, 3.8,4.0,4.2,4.3]]).T
df.columns = ['col1', 'col2','col3']

数据框:

  col1 col2 col3
0 1.1 A 1.1
1 1.1 A 1.7
2 2.5 A 2.5
3 2.6 B 2.6
4 2.5 B 3.3
5 3.4 B 3.8
6 2.6 B 4
7 2.6 A 4.2
8 3.4 B 4.3

我想根据某些条件对其进行分组。逻辑是基于col1 col2值和col3的累积差值:

  1. 转到 col1 并找到其他出现的相同值。
  2. 在我的例子中,col1 的第一个值是“1.1”,它们在 row2 的值也是相同的。
  3. 然后检查col2的值,如果它们相似,则得到col 3的累积差异。
  4. 如果累积差异大于 0.5,则将其标记为新 session 。
  5. 如果 col1 值相同但 col2 值不同则将它们标记为新 session

预期输出:

   col1 col2 col3 session
0 1.1 A 1.1 0
1 1.1 A 1.7 1
2 2.5 A 2.5 2
3 2.6 B 2.6 4
4 2.5 B 3.3 3
5 3.4 B 3.8 7
6 2.6 B 4 5
7 2.6 A 4.2 6
8 3.4 B 4.3 7

最佳答案

正如您链接到的优秀答案一样;)首先创建 session 编号:

In [11]: g = df.groupby(['col1', 'col2'])

In [12]: df['session_number'] = g['col3'].apply(lambda s: (s - s.shift(1) > 0.5).fillna(0).cumsum(skipna=False))

然后我想你想要设置这些列的索引,这对于许多用例来说可能就足够了(尽管可能值得进行一次排序):

In [13]: df1 = df.set_index(['col1', 'col2', 'session_number'])

In [14]: df1
Out[14]:
col3
col1 col2 session_number
1.1 A 0 1.1
1 1.7
2.5 A 0 2.5
2.6 B 0 2.6
2.5 B 0 3.3
3.4 B 0 3.8
2.6 B 1 4
A 0 4.2
3.4 B 0 4.3

如果你真的想要,你可以获取 session 号:

In [15]: g1 = df.groupby(['col1', 'col2', 'session_number'])  # I think there is a slightly neater way, but I forget..

In [16]: df1['session'] = g1.apply(lambda x: 1).cumsum() # could -1 here if it matters

In [17]: df1
Out[17]:
col3 session
col1 col2 session_number
1.1 A 0 1.1 1
1 1.7 2
2.5 A 0 2.5 3
2.6 B 0 2.6 6
2.5 B 0 3.3 4
3.4 B 0 3.8 8
2.6 B 1 4 7
A 0 4.2 5
3.4 B 0 4.3 8

如果你想在列中(如你的问题)reset_index,你可以删除 session 列:

In [18]: df1.reset_index()
Out[18]:
col1 col2 session_number col3 session
0 1.1 A 0 1.1 1
1 1.1 A 1 1.7 2
2 2.5 A 0 2.5 3
3 2.6 B 0 2.6 6
4 2.5 B 0 3.3 4
5 3.4 B 0 3.8 8
6 2.6 B 1 4 7
7 2.6 A 0 4.2 5
8 3.4 B 0 4.3 8

关于python - Pandas Dataframe 分成 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17568481/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com