python - 生成额外的行值,以便每个 ID 具有相同数量的条目

标签 python pandas dataframe

我在 Python Pandas 中有一个数据框,我已将其转换为获取特定列的 3 周 View :

<表类=“s-表”> <标题> id 状态 周数 年 <正文> 一个 1 52 2022 一个 1 51 2022 一个 0 50 2022
df["current_week"] = df.state
df["week_2"] = df.state.shift(-1) 
df["week_3"] = df.state.shift(-2)

最终结果是:

<表类=“s-表”> <标题> id 状态 周数 年 当前_周 week_2 week_3 <正文> 一个 1 52 2022 1 1 0 一个 1 51 2022 1 0 0 一个 0 50 2022 0 0 0 一个 0 47 2022 0 0 0 一个 0 46 2022 0 0 0

这满足了我的要求 - 但是,某些 ID 不会有完整的 52 周。我想为每个缺少几周的 ID 生成新行,并为状态估算 0,仅添加缺少的几周 - 因此保留现有的行。举个例子,假设 ID A 有第 52、51 和 50 周,但缺少 49 和 48 - 我想实现这一点:

<表类=“s-表”> <标题> id 状态 周数 年 当前_周 week_2 week_3 <正文> 一个 1 52 2022 1 1 0 一个 1 51 2022 1 0 0 一个 0 50 2022 0 0 0 一个 0 49 2022 0 0 0 一个 0 48 2022 0 0 0 一个 0 47 2022 0 0 0 一个 0 46 2022 0 0 0

这看起来非常简单,我确信是我缺乏简洁解释问题的能力,导致我无法在 Google 上找到答案。非常感谢任何帮助。

最佳答案

我认为这应该可以解决您的问题...

此代码将您的第一个表作为输入,使用 .groupby() 根据 id 进行分组,并生成一个数据帧,其中包含每个组的所有可能的周数。然后用 0 填充缺失值(基本上是按照评论中的要求将 state 设置为 0)

之后,连接所有新数据帧并创建移动 state 列的新列。

groups_dfs = []
for name, group in df.groupby('id'):
    df_tmp = pd.DataFrame({'week_number': list(range(1, 53))})
    df_tmp['id'] = name
    df_tmp = pd.merge(df_tmp, group, on=['id', 'week_number'], how='left')
    df_tmp = df_tmp.fillna(0)
    groups_dfs.append(df_tmp)

df_fixed = pd.concat(groups_dfs)
df_fixed = df_fixed.sort_values(['id', 'week_number'])

df_fixed["current_week"] = df_fixed.state
df_fixed["week_2"] = df_fixed.state.shift(-1) 
df_fixed["week_3"] = df_fixed.state.shift(-2)

关于python - 生成额外的行值,以便每个 ID 具有相同数量的条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75559386/

相关文章:

python - 这些频谱波段以前是靠肉眼判断的,怎么用程序来判断呢?

python - 如何对列表中的某些项目执行操作

dataframe - 从日期时间列中提取学期

Python:对于每个唯一的ID,找到它的代码和它的值并计算比率

python - 为单个 Pandas 列中的值创建虚拟列并将其分组为单行

python - Scrapy安装: no acceptable C compiler found in $PATH

Python请求获取JSON

python - pandas DataFrame 从 DateTimeIndex 中选择行列表 - KeyError。理解为什么

python - 将 Dataframe 列与 numpy ndarray 进行比较并更新数据框中的值

python - 如何通过从另一列复制值来填充缺失的 DataFrame 值