Python 将数据帧拆分到会话中

Python 将数据帧拆分到会话中,python,pandas,dataframe,Python,Pandas,Dataframe,这是我工作的延伸 为了使它更简单,让我们假设我有一个熊猫数据框,如下所示 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

这是我工作的延伸

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

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的累积差值:

  • 转到col1并查找相同值的其他匹配项
  • 在我的例子中,col1的第一个值是'1.1',第2行的值也是相同的
  • 然后检查col2值,如果它们相似,则得到COL3的累积差值
  • 如果累计差值大于0.5,则将其标记为新会话
  • 如果col1值相同,但col2值不同,则将其标记为新会话
  • 预期产出:

       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
    

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

    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 [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
    的列(如您的问题中)中显示此内容,您可以删除会话列:

    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
    

    @unutbu:应该是……)再次感谢……棒极了!。。。我无话可说!:)
    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