如何创建要操作的数据框 "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)
我有一个相当大的数据框,我需要按部分访问,这是由一个函数决定的。 像这样
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)