Python 根据特定列的条件,将一组行的数据帧值分配给另一组行

Python 根据特定列的条件,将一组行的数据帧值分配给另一组行,python,pandas,Python,Pandas,我试图根据条件将某些特定列的行的df值分配给其他行。 当我执行以下操作时,它会起作用,因为第2周以下的周数或相等的周数对于作业双方都是相同的 data = {'year': [2020,2020,2020,2020,2021,2021,2021], 'id':[1,1,1,1,1,1,1], 'week': [1,2,3,4,1,2,4], 'value':[0.1,0.2,0.3,0.4,0.5,0.6,0.7]} df = pd.DataFrame(data) df year

我试图根据条件将某些特定列的行的df值分配给其他行。
当我执行以下操作时,它会起作用,因为第2周以下的周数或相等的周数对于作业双方都是相同的

data = {'year': [2020,2020,2020,2020,2021,2021,2021],
'id':[1,1,1,1,1,1,1],
'week': [1,2,3,4,1,2,4],
'value':[0.1,0.2,0.3,0.4,0.5,0.6,0.7]}
df = pd.DataFrame(data)
df


      year id  week value
0   2020    1   1   0.1
1   2020    1   2   0.2
2   2020    1   3   0.3
3   2020    1   4   0.4
4   2021    1   1   0.5
5   2021    1   2   0.6
6   2021    1   4   0.7
任务:

df.loc[(df['year'] == 2021) & (df['week']<= 2),'value'] = df.loc[(df['year'] == 2020) & (df['week']<= 2),'value'].to_numpy()
df
但是,当我将作业更改为第2周以上时,它将不起作用,因为双方的大小不相等:

df.loc[(df['year'] == 2021) & (df['week']>= 2),'value'] = df.loc[(df['year'] == 2020) & (df['week']>= 2),'value'].to_numpy()
df 
ValueError:在使用 宜人的

我试着在没有。to_numpy()的情况下这样做,但后来我在2021年得到了NaN

编辑: 当我使用with.to_numpy()时,我得到的是:

df.loc[(df['year'] == 2021) & (df['week']<= 2),'value'] = df.loc[(df['year'] == 2020) & (df['week']<= 2),'value']
df

    year   id week value
0   2020    1   1   0.1
1   2020    1   2   0.2
2   2020    1   3   0.3
3   2020    1   4   0.4
4   2021    1   1   NaN
5   2021    1   2   NaN
6   2021    1   4   0.7

df.loc[(df['year']==2021)和(df['week']基于指数的首次尝试:

  • [“年”、“id”、“周”]
    设置为数据帧的索引:
  • 选择数据帧的子集作为新值:
  • 修改新值索引(2020年)→ 2021年)
  • 用新值更新数据帧
  • 对于
    周>=2

    >>> df = df.set_index(["year", "id", "week"])
    >>> vals = df.loc[pd.IndexSlice[2020, :, range(2, 10)]]
    >>> vals.index = vals.index.set_levels([2021], level="year")
    >>> df.update(vals)
    >>> df
                  value
    year id week
    2020 1  1       0.1
            2       0.2
            3       0.3
            4       0.4
    2021 1  1       0.5
            2       0.2  # changed from 0.6
            4       0.4  # changed from 0.7
    
    更新:使用
    df.query
    而不是
    df.loc

    替换:

    >>> df = df.loc[pd.IndexSlice[2020, :, range(3)]]
    >>> df.loc[pd.IndexSlice[2020, :, range(2, 10)]]
    
    作者:

    >>df.query(“(年份==2020)和(周=2)”)
    

    这更直观!

    如果“忽略”是你想要的,为什么nans不好?你能显示预期的输出吗?@Gulzar我得到NaN不是因为缺少值,而是因为我不使用时整个赋值范围。to_numpy().我添加了一个示例,如果长度不相等,那么您希望根据哪些标准填充这些值?您可以使用mean df['value']=df['value']=df['value']].fillna(value=df.loc[[df['year']=2020]和(df['week']>=2)]。value.mean()我简化了处理条件的问题。@Nk03我不想为NAs填充任何内容。我只想为满足条件的行细分值
    >>> vals = df.loc[pd.IndexSlice[2020, :, range(3)]]
    >>> vals
                  value
    year id week
    2020 1  1       0.1
            2       0.2
    
    >>> vals.index = vals.index.set_levels([2021], level="year")
    >>> vals
                  value
    year id week
    2021 1  1       0.1
            2       0.2
    
    >>> df.update(vals)
    >>> df
                  value
    year id week
    2020 1  1       0.1
            2       0.2
            3       0.3
            4       0.4
    2021 1  1       0.1  # changed from 0.5
            2       0.2  # changed from 0.6
            4       0.7
    
    >>> df = df.set_index(["year", "id", "week"])
    >>> vals = df.loc[pd.IndexSlice[2020, :, range(2, 10)]]
    >>> vals.index = vals.index.set_levels([2021], level="year")
    >>> df.update(vals)
    >>> df
                  value
    year id week
    2020 1  1       0.1
            2       0.2
            3       0.3
            4       0.4
    2021 1  1       0.5
            2       0.2  # changed from 0.6
            4       0.4  # changed from 0.7
    
    >>> df = df.loc[pd.IndexSlice[2020, :, range(3)]]
    >>> df.loc[pd.IndexSlice[2020, :, range(2, 10)]]
    
    >>> df.query("(year == 2020) and (week <= 2)")
    >>> df.query("(year == 2020) and (week >= 2)")