python - 每次列中的字符串值更改时如何拆分数据框?
问题描述
我有一个表单的数据框:
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]
推荐阅读
- linux - 仅提取文件名的 Shell 脚本
- c++ - 键盘不工作 - Arduino Uno - 与变量有关的多个错误
- r - 有没有一种优雅的方式来划分两个摘要的结果?
- c# - 带有 if 语句的 C# Switch Case 不返回控制台.WriteLines
- snakemake - 用 shell 和 conda 解压蛇
- matlab - Matlab 中 AppDesigner 中的 imread() 函数导致的错误
- android - 在 kotlin 中单击按钮时添加 Edittext 和 Button
- docker - 在 Kubernetes 设置期间保留我的服务器 O/S 的静态 IP 地址
- python - vscode pylint linter 的路径无效
- mysql - 用 1.5m 记录优化 mysql 表,其中大多数记录被软删除