gpt4 book ai didi

python - 根据特定列的条件将一组行的数据框值分配给另一组行

转载 作者:行者123 更新时间:2023-12-04 07:44:45 25 4
gpt4 key购买 nike

我正在尝试根据条件将某些特定列的行的 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
结果:
    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.1
5 2021 1 2 0.2
6 2021 1 4 0.7
但是,当我将作业更改为第 2 周以上时,它将不起作用,因为双方的大小不相等:
df.loc[(df['year'] == 2021) & (df['week']>= 2),'value'] = df.loc[(df['year'] == 2020) & (df['week']>= 2),'value'].to_numpy()
df

ValueError: Must have equal len keys and value when setting with aniterable


我试图在没有 .to_numpy() 的情况下做到这一点,但后来我得到了 2021 年的 NaN。
编辑:
当我在没有 .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
在这种情况下,2021 年的第 1 周和第 2 周不应得到 NaN。
虽然这里的手动解决方案是“简单的”,我不能使用有问题的几周,但它不可扩展,我无法在包含数万条记录的主 df 中使用它。
注意 - 此示例中缺失的周是 2021 周,因此是分配目的地,但是缺失的周也可能在 2020 年,因此解决方案也必须回答这种情况
当我尝试完成这样的任务并只为双方现有的任务分配时,忽略这些缺失的几周的最有效方法是什么?

最佳答案

基于索引的第一次尝试:

  • 套装["year", "id", "week"]作为数据框的索引:
  • >>> df = df.set_index(["year", "id", "week"])
    >>> df
    value
    year id week
    2020 1 1 0.1
    2 0.2
    3 0.3
    4 0.4
    2021 1 1 0.5 # change to 0.1
    2 0.6 # change to 0.2
    4 0.7
  • 选择数据帧的子集作为新值:
  • >>> vals = df.loc[pd.IndexSlice[2020, :, range(3)]]
    >>> vals
    value
    year id week
    2020 1 1 0.1
    2 0.2
  • 修改新值索引(2020→2021)
  • >>> 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
    对于 week >= 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("(year == 2020) and (week <= 2)")
    >>> df.query("(year == 2020) and (week >= 2)")
    它更直观!

    关于python - 根据特定列的条件将一组行的数据框值分配给另一组行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67253288/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com