簡體   English   中英

每次列中的字符串值更改時如何拆分數據框?

[英]How to split a dataframe each time a string value changes in a column?

我有一個形式的數據框:

         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

我會創建一個在每次更改時遞增的列,然后按該列分組。 如果您需要單獨的數據幀,您可以在循環中分配它們。

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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM