基于数组连续正负值计数,向双列DataFrame追加数据的方法求助
解决连续值计数并生成目标DataFrame的方案
我来帮你搞定这个问题!要实现根据数组y的连续值计数来生成两列的DataFrame,我们可以用Pandas的分组功能高效处理,下面是具体步骤和完整代码:
步骤1:导入依赖并准备数据
首先导入Pandas,定义你的目标数组:
import pandas as pd y = [1, -1, -1, 1, 1, 1, 1, -1, -1]
步骤2:识别连续值的分组
我们需要先把数组中连续相同值的片段分成不同组,通过比较当前元素和前一个元素的差异,生成唯一的分组ID:
# 将数组转为Series方便后续处理 s = pd.Series(y) # 当当前元素和前一个元素不同时标记为True,累加后得到每个连续段的唯一ID group_ids = s.ne(s.shift()).cumsum()
步骤3:统计每个连续段的数值和次数
基于分组ID,我们可以快速统计每个连续段的对应数值和出现次数:
# 每个分组的第一个元素就是该段的目标数值 segment_values = s.groupby(group_ids).first() # 每个分组的大小就是该数值连续出现的次数 segment_counts = s.groupby(group_ids).count()
步骤4:生成目标DataFrame
把统计结果转换成包含1_counts和-1_counts两列的格式,对应段的次数填入对应列,其他列补0:
# 先创建包含数值和次数的临时DataFrame temp_df = pd.DataFrame({'value': segment_values, 'count': segment_counts}) # 转成两列格式,空值填充0并转为整数类型 df_count = temp_df.pivot(columns='value', values='count').fillna(0).astype(int) # 重命名列名让结果更直观 df_count.columns = [f'{col}_counts' for col in df_count.columns] # 重置索引(可选,让索引从0开始) df_count = df_count.reset_index(drop=True)
运行完上述代码后,df_count就是你期望的结果:
1_counts -1_counts 0 1 0 1 0 2 2 4 0 3 0 2
额外场景补充
如果你的需求是给原始数组的每个元素都添加对应连续计数(比如每个位置显示当前连续值的累计次数),可以用下面的代码:
df = pd.DataFrame({'y': y}) df['current_count'] = df.groupby(group_ids).cumcount() + 1 df['1_counts'] = df.apply(lambda row: row['current_count'] if row['y'] == 1 else 0, axis=1) df['-1_counts'] = df.apply(lambda row: row['current_count'] if row['y'] == -1 else 0, axis=1)
这样得到的DataFrame会和原始数组长度一致,每个元素对应自己所在连续段的累计计数。
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

