如何修改DataFrame切片对应的原DataFrame中指定列的值?
问题描述
我执行以下代码筛选DataFrame的切片:
market_info_df.loc[(market_info_df['issue_status'] == '10') & (market_info_df['market_phase'] == '0') & (market_info_df['trading_state'] == ' ')].iloc[0]
得到的切片内容如下:
activity 0 msg_original_type 0 sequence_no 0 system_event timestamp 2021-12-13 15:17:28.593198 trading_status 1 market_state None
我想把原market_info_df中该切片对应的market_state值改为OPENING_AUCTION,尝试了以下代码:
first_row = market_info_df.loc[(market_info_df['issue_status'] == '10') & (market_info_df['market_phase'] == '0') & (market_info_df['trading_state'] == ' ')].iloc[0] first_row['market_state'] = 'OPENING_AUCTION'
但执行print(market_info_df)后发现原DataFrame里的对应值没改,只改了first_row这个切片对象的值,请问怎么直接修改原DataFrame的对应值?
解决方案
你之前的代码里,loc[...]].iloc[0]返回的是原DataFrame的副本而非视图,所以修改副本不会影响原DataFrame。要直接修改原数据,可采用以下两种方法:
方法1:直接用loc定位行和列
将筛选条件与目标列名组合,直接赋值修改原DataFrame:
market_info_df.loc[ (market_info_df['issue_status'] == '10') & (market_info_df['market_phase'] == '0') & (market_info_df['trading_state'] == ' '), 'market_state' ] = 'OPENING_AUCTION'
该方法会直接修改所有符合条件行的market_state列,若你确认只有一行符合条件,这是最直接的方式。
方法2:获取目标行索引后赋值
先提取符合条件行的索引,再通过索引定位修改:
# 获取符合条件行的索引 target_index = market_info_df.loc[ (market_info_df['issue_status'] == '10') & (market_info_df['market_phase'] == '0') & (market_info_df['trading_state'] == ' ') ].index[0] # 通过索引修改原DataFrame的值 market_info_df.loc[target_index, 'market_state'] = 'OPENING_AUCTION'
这种方法适合需要单独处理索引的场景,确保仅修改指定的那一行。
内容的提问来源于stack exchange,提问作者user19667022
相关产品推荐
相关产品推荐

