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



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

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或不使用。loc的不同方法时给我一个CopyWarning。

Btw,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)

最新更新