如何创建要操作的数据框 "window" 或切片?

How can I create a dataframe "window" or slice to manipulate?

我有一个相当大的数据框,我需要按部分访问,这是由一个函数决定的。 像这样

df
             gtin                          serial  box_number  item_nr_in_box
0   7804320303178  0107804********************119           0                0
1   7804320303178  0107804*********************19           0                0
2   7804320303178  0107804*********************29           0                0
3   7804320303178  0107804*********************39           0                0
4   7804320303178  0107804*********************49           0                0
5   7804320303178  0107804*********************99           0                0
6   7804320303178  0107804*********************89           0                0

由动态值确定的数据帧片段,例如:

df[df['gtin']==my_gtin][start:end]

在这些地方我需要更改一些列值,例如 box_number 和 item_nr_in_box,例如:

df[df['gtin']==my_gtin][start:end].assign(box_number=1,item_nr_in_box=range(start,end))

这有效并在屏幕上显示了一个新的数据框。

我想将新值应用到现有的 df,但我似乎无法对结果做任何事情。既不使用新值设置原始数据框中的值,也不将 assign() 的结果附加到空数据框中。

我要么抱怨“无法使用多维键索引”,要么在尝试使用或不使用 .loc 的不同方法时给我 CopyWarning。

顺便说一句,df[df['gtin']==my_gtin][start:end].assign(box_number=1,item_nr_in_box=range(start,end)).index 给出:Int64Index([0, 1, 2, 3, 4], dtype='int64')。所以我什至不明白多维性是从哪里来的。

我想要类似的东西

df_link=df.loc[ df['gtin']==mygtin][start:end] ]
df[df_link]=df[df_link].assign( ... )

但我明白了,“必须仅使用布尔值传递 DataFrame”

正确的方法是什么,最好不要创建重复的 df?

(Pandas 0.24.2, Ubuntu 18.04.LTS)

更新:

df 构造示例:

df=pd.DataFrame({'gtin': ['ABC']*10 + ['DEF']*5, 'serial': range(start,start+15), 'box_number': [0]*15, 'item_nr_in_box':[0]*15 })

Chained indexing 不推荐,如文档中所示。您可以在每个 gtin 值中创建一个新列 gtin_num 作为您的 row number,然后像这样使用 .loc

start = 0
end = 3
df['gtin_num'] = df.groupby(['gtin']).cumcount()
df.loc[(df['gtin']=='ABC') & (df['gtin_num'].isin(range(start, end))), ['box_number', 'item_nr_in_box']] = 1, range(start, end)