如何在一定条件下为Pandas添加新品系

2024-09-28 05:19:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据集:

ID    week    count_tasks

1     3        1
2     3        4
3     4        3
3     5        2
4     28       1
...   ...      ...
7151  21       1
7152  29       1

我想在列weekweek中添加一个新行,从1到53(或从week.min()到aweek.max())。如果本周没有count_tasks,则列count_tasks将为0

例如:

ID    week    count_tasks

1     1        0
1     2        0
1     3        1
1     4        0
...   ...      ...
1     53       0
2     1        0
...   ...      ...


Tags: 数据idcountminmaxtasksweekweekweek
2条回答

您可以尝试使用pivot,然后在轴=1上重新索引,然后重新堆叠:

week_min = 1 # replace with week.min()
week_max = 53 #replace with week.max()
out = (df.set_index(['ID','week'])['count_tasks'].unstack()
   .reindex(range(week_min,week_max+1),axis=1).stack(dropna=False).fillna(0)
    .reset_index(name='count_tasks'))
print(out)

#前4个ID(5行)的样本输出:

     ID  week  count_tasks
0     1     1          0.0
1     1     2          0.0
2     1     3          1.0
3     1     4          0.0
4     1     5          0.0
..   ..   ...          ...
207   4    49          0.0
208   4    50          0.0
209   4    51          0.0
210   4    52          0.0
211   4    53          0.0

[212 rows x 3 columns]

这是另一种方法,更简单一点,因为它不使用堆栈/取消堆栈

(df.set_index(['ID', 'week'])
    .reindex(
        pd.MultiIndex.from_product([df.ID.unique(), range(df.week.min(), df.week.max() + 1)])
        .set_names(['ID', 'week']),
        fill_value=0)
    .reset_index())

pd.MultiIndex.from_product将根据给定列表中的所有组合自动创建索引。重置索引后,我需要使用set_names恢复列名


样本数据的结果:

# Data used
df = pd.DataFrame({
    'ID': [1, 1, 1, 2, 2, 2], 
    'week': [4, 5, 7, 1, 35, 52], 
    'count_tasks': [1, 1, 2, 1, 1, 1]})
      ID  week  count_tasks
0     1     1             0
1     1     2             0
2     1     3             0
3     1     4             1
4     1     5             1
..   ..    ..            ..
99    2    48             0
100   2    49             0
101   2    50             0
102   2    51             0
103   2    52             1

如你所见,周数从最小到最大

相关问题 更多 >

    热门问题