如何按分组替换Pandas DataFrame中的nan值(fillna分组填充)
如何按分组替换DataFrame中的'nan'字符串?
你遇到的问题很典型——直接遍历DataFrame的values修改副本不会影响原数据,所以之前的循环方法才没生效。下面给你两种实用的解决方案,根据你的需求选就行:
方案一:手动指定每个分组的替换值
如果你已经明确知道每个group对应的替换内容,比如Climatological组的'nan'要换成'Drought',可以先定义一个映射字典,再用loc定位修改:
# 先初始化你的DataFrame import pandas as pd data_pd = pd.DataFrame({'type':['Drought','nan','Explosion','Ground movement','nan','Ash fall','Rockfall','Ash fall','nan','Explosion','nan'], 'group':['Climatological','Climatological','Technological','Geophysical','Geophysical', 'Geophysical','Geophysical','Geophysical','Technological','Technological','Meteorological']}) # 定义每个分组对应的替换值 replace_map = { 'Climatological': 'Drought', 'Geophysical': 'Ground movement', # 你可以改成该组的其他值,比如'Ash fall' 'Technological': 'Explosion', 'Meteorological': 'Meteorological Event' # 自定义该组的替换内容 } # 定位type为'nan'的行,根据group匹配替换值 data_pd.loc[data_pd['type'] == 'nan', 'type'] = data_pd.loc[data_pd['type'] == 'nan', 'group'].map(replace_map)
方案二:自动用分组内最常见的type值替换
如果想让程序自动取每个group里出现次数最多的type值来替换'nan'(更通用),可以先计算每个分组的众数,再映射替换:
# 计算每个group中type的众数(排除'nan') group_mode = data_pd[data_pd['type'] != 'nan'].groupby('group')['type'].agg(lambda x: x.mode()[0]) # 替换所有'nan' data_pd.loc[data_pd['type'] == 'nan', 'type'] = data_pd.loc[data_pd['type'] == 'nan', 'group'].map(group_mode)
为什么你的原方法无效?
你之前用zip(data_pd['type'].values, ...)遍历得到的是每个元素的副本,修改ty变量只是修改了这个副本,根本不会影响原DataFrame里的数据。Pandas的设计更适合用向量化操作(比如loc、map)来直接操作数据,而不是用Python循环逐个修改。
内容的提问来源于stack exchange,提问作者me.limes
相关产品推荐
相关产品推荐

