DataFrame列访问方式差异及fillna、replace写法区别咨询
Pandas 数据处理常见问题解答
1. df['column_name'] 与 df.column_name 的区别
- 列名限制不同:
df.column_name只能用在列名是合法Python标识符的场景——比如列名不能有空格、不能以数字开头、不能是class/def这类Python关键字;而df['column_name']没有任何限制,不管列名多复杂(比如"user 1 age")都能正常使用。 - 动态列名支持不同:如果列名存在变量里(比如
col = 'filed_complaint'),只能用df[col]来访问对应列;用df.col的话,程序会去找名为col的列,而不是变量col存储的列名。 - 场景适配不同:简单合规的列名用
df.column_name更简洁,但涉及复杂列名或动态逻辑时,必须用df['column_name']。
2. 各组代码格式的差异分析
第一组 fillna 代码(处理数值列缺失值)
三个代码行的核心差异在于是否修改原DataFrame:
df['filed_complaint'] = df.filed_complaint.fillna(0)- 这行是有效修改原数据:
fillna(0)默认返回填充后的新Series,赋值操作把这个新Series覆盖原列,原df的filed_complaint列会被更新。
- 这行是有效修改原数据:
df['filed_complaint'].fillna(0)- 仅生成填充后的新Series,但没有保存回原df,原列的缺失值完全没变化,相当于白跑了(除非把结果存到变量里)。
df.filed_complaint.fillna(0)- 和第二行逻辑完全一致,只是用属性访问的方式调用
fillna,同样不会修改原df,只返回结果。
- 和第二行逻辑完全一致,只是用属性访问的方式调用
第二组 fillna 代码(处理字符串列缺失值)
逻辑和第一组完全对应:
df['department'] = df.department.fillna('Missing')- 有效更新原df的
department列:填充后的新Series覆盖原列,原数据被修改。
- 有效更新原df的
df['department'].fillna('Missing')- 仅返回填充后的结果,不影响原df,原列的缺失值还在。
df.department.fillna('Missing')- 和第二行效果一样,属性访问调用
fillna,不修改原数据。
- 和第二行效果一样,属性访问调用
第三组 replace 代码(替换指定值)
这组的差异主要在inplace=True的使用:
df['department'] = df.department.replace('information_technology', 'IT', inplace=True)- 这是错误写法:当
inplace=True时,replace会直接修改原Series,并且返回None。这行代码相当于把None赋值给df['department'],会把整个列变成空值。
- 这是错误写法:当
df['department'].replace('information_technology', 'IT', inplace=True)- 正确修改原数据:
inplace=True让replace直接在原列上执行替换,不需要额外赋值,原department列会被更新。
- 正确修改原数据:
df.department.replace('information_technology', 'IT', inplace=True)- 和第二行效果完全一致,用属性访问方式调用
replace,inplace=True直接修改原列,无需赋值。
- 和第二行效果完全一致,用属性访问方式调用
内容的提问来源于stack exchange,提问作者Ramsey A.
相关产品推荐
相关产品推荐

