首页 > 解决方案 > 每次列中的字符串值更改时如何拆分数据框?

问题描述

我有一个表单的数据框:

         time     value   label
0  2020-01-01 -0.556014    high
1  2020-01-02  0.185451    high
2  2020-01-03 -0.401111  medium
3  2020-01-04  0.436111  medium
4  2020-01-05  0.412933    high
5  2020-01-06  0.636421    high
6  2020-01-07  1.168237    high
7  2020-01-08  1.205073    high
8  2020-01-09  0.798674    high
9  2020-01-10  0.174116    high

我想填充一个数据框列表,当列中的字符串label发生变化时,每个数据框都在其中构建。所以第一个数据框是:

         time     value   label
0  2020-01-01 -0.556014    high
1  2020-01-02  0.185451    high

第二个数据框是:

         time     value   label
2  2020-01-03 -0.401111  medium
3  2020-01-04  0.436111  medium

等等。所需的列表是[df, df, ...]. 如果您认为 dict 将是一个更合适的容器,我根本不会介意。

有一个类似的帖子名为split data frame pandas if sequence of column value change,但它只处理数值的变化。我做了一些尝试,但在将行值label与前一个值进行比较时,总是遇到索引问题。所以任何建议都会很棒!

这是一个可重现的片段:

# imports
import plotly.express as px
import plotly.graph_objects as go
import pandas as pd
import numpy as np
import random

# settings
observations = 100
np.random.seed(5)
value = np.random.uniform(low=-1, high=1, size=observations).tolist()
time = [t for t in pd.date_range('2020', freq='D', periods=observations).format()]

df=pd.DataFrame({'time': time, 
                 'value':value})
df['value']=df['value'].cumsum()

def classify(e):
    if e > 0.75: return 'high'
    if e > 0.25: return 'medium'
    if e >= 0: return 'low'

df['label1'] = [(elem-df['value'].min())/(df['value'].max()-df['value'].min()) for elem in df['value']]
df['label'] = [classify(elem) for elem in df['label1']]
df = df.drop('label1', 1)
df

标签: pythonpandas

解决方案


我将创建一个在每次更改时递增的列,然后按该列分组。如果您需要单独的数据框,您可以在循环中分配它们。

df['group'] = df['label'].ne(df['label'].shift()).cumsum()
df = df.groupby('group')
dfs = []
for name, data in df:
    dfs.append(data)

dfs 将是一个数据框列表,如下所示:

[         time     value label  group
 0  2020-01-01 -0.556014  high      1
 1  2020-01-02  0.185451  high      1,
          time     value   label  group
 2  2020-01-03 -0.401111  medium      2
 3  2020-01-04  0.436111  medium      2,
          time     value label  group
 4  2020-01-05  0.412933  high      3
 5  2020-01-06  0.636421  high      3
 6  2020-01-07  1.168237  high      3
 7  2020-01-08  1.205073  high      3
 8  2020-01-09  0.798674  high      3
 9  2020-01-10  0.174116  high      3]

推荐阅读