Python 根据特定列的条件,将一组行的数据帧值分配给另一组行
我试图根据条件将某些特定列的行的df值分配给其他行。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
当我执行以下操作时,它会起作用,因为第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)")