我有一个相当大的数据框架,我需要按块访问,这是由一个函数决定的。这样的
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)