Python 3.x中如何从列表提取DataFrame缺失值生成新DataFrame
解决方法:提取列表中有但DataFrame中没有的值生成新DataFrame
嘿,我来帮你搞定这个问题!你想要的是找出day_list里存在但df['days']中没有的元素,再把这些元素转成新的DataFrame对吧?先说说你之前代码的问题,再给你两种靠谱的实现方式:
为什么之前的代码不对?
- 你的第一个代码块
df1 = df[~df.days.isin(day_list)]:逻辑搞反啦!你是在原DataFrame里筛选不在day_list中的行,但原df的所有days值都包含在day_list里,所以自然得到空DataFrame。 - 第二个代码块
df2 = df[~day_list.isin(df.days)]:isin()是pandas的Series或DataFrame专属方法,普通Python列表没有这个属性,所以会抛出AttributeError。
正确的实现方式
方法1:用Python列表推导式筛选(直观易懂)
先从day_list里筛选出不在df['days']中的元素,再把这些元素转换成DataFrame:
import pandas as pd # 创建原DataFrame df = pd.DataFrame({'days':['monday','tuesday','wednesday','thursday','friday']}) # 完整的星期列表 day_list = ['monday','tuesday','wednesday','thursday','friday','saturday','sunday'] # 筛选出day_list有但df没有的元素 missing_days = [day for day in day_list if day not in df['days'].tolist()] # 转换成新的DataFrame df_missing = pd.DataFrame({'days': missing_days}) print(df_missing)
输出结果:
days 0 saturday 1 sunday
方法2:用pandas Series处理(更贴合pandas风格)
把day_list转换成pandas的Series,再用isin()方法筛选,最后转成DataFrame:
import pandas as pd df = pd.DataFrame({'days':['monday','tuesday','wednesday','thursday','friday']}) day_list = ['monday','tuesday','wednesday','thursday','friday','saturday','sunday'] # 把列表转成Series s_day_list = pd.Series(day_list) # 筛选出不在df['days']中的元素 missing_series = s_day_list[~s_day_list.isin(df['days'])] # 转换成DataFrame并指定列名 df_missing = missing_series.to_frame(name='days') print(df_missing)
这个方法和你熟悉的R代码逻辑很像:R里的day_list[! (day_list %in% df$days)]对应到这里就是s_day_list[~s_day_list.isin(df['days'])],只是语法稍有不同。
内容的提问来源于stack exchange,提问作者Code_Sipra
相关产品推荐
相关产品推荐

