数据处理-处理缺失值、去除空格值、数据分组、虚拟变量

本文详细介绍了如何在Python中使用Pandas库进行数据预处理,包括检查和处理缺失值、数据清洗、字段拆分与重组、数据分组及虚拟变量创建等关键步骤,为高效的数据分析奠定基础。

查看缺失值

dataframe.isnull( ) 

 

填补缺失值

向上填充法 .ffill( )

向下填充法 .bfill( )

将某个特定的值x填充空白值 .fillna(x)

删除含有缺失值的样本 .dropna( ) 

trips1.csv

start_id,end_id,start_date
0,55,55,'8/29/2013 14:13'
1,55,55,'8/29/2013 14:13'
2,55,55,'8/29/2013 14:13'
3,55,55,'8/29/2013 14:13'
4,55,55,'8/29/2013 14:13'
5,55,55,'8/29/2013 14:13'

trips2.csv

start_id,end_id,start_date
55,,'8/29/2013 15:13'
55,,'8/29/2013 16:13'
55,,'8/29/2013 17:13'
55,,'8/29/2013 18:13'
55,,'8/29/2013 19:13'
55,,'8/29/2013 20:13'

trips3.csv

start_id,end_id,start_date
55,56,'8/29/2013 14:13'
55,55,'8/29/2013 14:14'
55,55,'8/29/2013 14:15'
55,55,'8/29/2013 14:16'
55,55,'8/29/2013 14:17'
55,55,'8/29/2013 14:18'

stations.csv

id,name,adderss
55,'#GuoMao#','Beijing'
55,'#SUN#','ShangHai'
55,'#Park#','Beijing'
55,'#Light#','Shanghai'
55,'#Dark#','ShanDong'

代码如下:

import pandas as pd
stations = pd.read_csv('stations.csv',encoding='utf-8')
print(stations.head())

trips1 = pd.read_csv('trips1.csv',encoding='utf-8')

trips2 = pd.read_csv('trips2.csv',encoding='utf-8')

trips3 = pd.read_csv('trips3.csv',encoding='utf-8')


#将trips1、trips2、trips3合并为一个Dataframe,命名为trips
trips = pd.concat([trips1,trips2,trips3])

#将stations中所有列名称前添加字段‘start_’,并将start_id设置为列索引
stations.columns = stations.columns.map(lambda x:'start_'+x)



#将trips和stations按照起始车站id进行字段匹配并合并,保留所有匹配成功的信息
print('----合并后----')
trips_stations = trips.merge(stations,on='start_id')
print(trips_stations)


#将trips_stations导出为'将'trips_stations.csv'文件
trips_stations.to_csv('trips_stations.csv')


#查看trips_stations中是否包含有缺失值,为空的时候是True
print(trips_stations.isnull())

#输出为空的数据行
isNa_trips_stations = trips_stations.isnull()
print(trips_stations[isNa_trips_stations.any(axis=1)])

print(trips_stations)
#缺失值数据使用他上方的数据进行填充
trips_stations = trips_stations['end_id'].ffill()
print(trips_stations)

#缺失值数据使用他下方的数据进行填充
trips_stations = trips_stations['end_id'].bfill()
print(trips_stations)

#将中位数x填充空白值
docks_median = trips_stations['start_docks'].median()
trips_stations['end_id'] = trips_stations['start_docks'].fillna(docks_median)

# 删除含有缺失值的样本
trips_stations = trips_stations.dropna()
print(trips_stations)

去除空格值

去除字段左边的空格 .lstrip( )

去除字段右边的空格 .rstrip( )

去除左右两边的空格 .strip( )

删除左右边的某个字段,可以将该字段填入括号

trips_stations['start_name'] = trips_stations['start_name'].str.strip('#')

拆分字段

split( )

不带参数的时候,按照空格进行拆分,带参数的时候按照该参数进行拆分。

 

插入某一列

dataframe.insert( )

参数loc:插入列的位置。

参数column:插入列的名称。

参数value: 插入列的内容。

new_col = trips_stations['start_date'].str.split(' ',1,True)
new_col.columns = ['start_date','start_time']
trips_stations['start_date'] = new_col['start_date']
trips_stations.insert(loc = 3,column='start_time',value = new_col['start_time'])

数据分组

pandas.cut( )

参数 bins 为分组边界。

 

在dataframe添加一列,确定添加列的位置时,可以将dataframe的columns先转换为list,再使用 .index( ) 函数获得所添加列的位置索引。

bins = [min(trips_stations['start_docks'])-1,13,15,17,19,21,23,25,max(trips_stations.start_docks)+1]
labels = ['13以下','13到15','15到17','17到19','19到21','21到23','23到25','25以上']
cut = (pd.cut(trips_stations['start_docks'],bins,right=False,labels=labels))

col_name = trips_stations.columns.tolist()
trips_stations.insert(loc=col_name.index('start_docks')+1,column = 'start_docks_classification',value = cut)
print(trips_stations.head())

虚拟变量

又称哑变量,通常取值为0或1。引入哑变量可以使问题描述更加简明。

pd.get_dummies( ) 

参数column:欲转换为虚拟变量的指标。

参数prefix:定义列名称。

#添加虚拟变量
# 将subscription_type转化为虚拟变量,添加在dateframe的最后一列
trips_stations_dummies = pd.get_dummies(trips_stations,columns=['start_subscription_type'],
               prefix=['start_subscription_type'],prefix_sep='_')

trips_stations_dummies['start_subscription_type'] = trips_stations['start_subscription_type']

print(trips_stations_dummies.head())

 

<think>我们遇到的问题是:在Stata中运行包含i.year的回归命令,出现错误提示“unrecognized command: i.year invalid command name”。 这个错误通常是因为Stata无法识别因子变量(factor variable)的写法。在Stata中,因子变量需要使用`i.`前缀来表示分类变量(如年份、地区等),但有可能因为以下原因导致该命令不被识别: 1. Stata版本过低(低于Stata 11) 2. 没有正确安装或更新`factor variables`相关功能 3. 命令输入错误(如空格、标点等) 解决方案: 1. 确认Stata版本:由于用户使用的是Stata13.1,该版本支持因子变量,因此版本问题可以排除。 2. 检查命令输入:确保在`i.year`之前有空格,且`year`是数据集中存在的变量。 3. 使用`xi:`前缀:对于较老的命令习惯或者某些特殊情况,可以使用`xi:`前缀来运行包含分类变量的模型。 具体步骤: 方法1:直接使用因子变量(推荐) 确保命令输入正确,例如: ```stata xtreg ln_pat_next ln_policy ln_gdp ln_tech ln_edu ln_fdi ln_ind i.year, fe ``` 注意:`i.year`前面有空格,且`year`变量确实存在。 方法2:使用`xi:`前缀 如果直接使用`i.year`仍然报错,可以使用`xi:`前缀来展开分类变量: ```stata xi: xtreg ln_pat_next ln_policy ln_gdp ln_tech ln_edu ln_fdi ln_ind i.year, fe ``` 这样,Stata会先将分类变量转换为虚拟变量,然后再进行回归。 方法3:手动生成年份虚拟变量 如果上述方法都不行,可以手动创建年份虚拟变量: ```stata tab year, gen(year_dum) ``` 然后,在回归中使用这些虚拟变量(注意去掉基准组,以避免完全共线性): ```stata xtreg ln_pat_next ln_policy ln_gdp ln_tech ln_edu ln_fdi ln_ind year_dum2-year_dumT, fe ``` 其中,`year_dum2`到`year_dumT`是生成的年份虚拟变量(假设有T个年份,第一个年份作为基准组被省略)。 示例代码: 我们使用方法2作为示例: ```stata * 使用xi前缀运行双向固定效应模型 xi: xtreg ln_pat_next ln_policy ln_gdp ln_tech ln_edu ln_fdi ln_ind i.year, fe vce(cluster province) * 存储结果 estimates store fe_model_xi ``` 然后输出结果到Word的步骤不变。 注意:使用`xi:`,Stata会自动生成虚拟变量,并在回归结果中显示为`_Iyear_2010`等。但要注意,如果年份很多,可能会产生很多虚拟变量,使得结果表格很长。 如果问题仍然存在,请检查数据中是否有`year`变量,以及该变量是否为数型(非字符型)。 下面给出完整的修正代码: 假设我们之前已经对数化处理并生成了滞后项,且已经声明了面板数据。 修正回归命令: ```stata * 方法1:直接使用因子变量(如果支持) * 如果报错则使用方法2 * 尝试直接运行(如果报错则用方法2) capture noisily xtreg ln_pat_next ln_policy ln_gdp ln_tech ln_edu ln_fdi ln_ind i.year, fe vce(cluster province) if _rc != 0 { * 使用方法2:xi前缀 xi: xtreg ln_pat_next ln_policy ln_gdp ln_tech ln_edu ln_fdi ln_ind i.year, fe vce(cluster province) } ``` 但是,通常我们更推荐使用方法2,因为它在老版本中更稳定。 解释: - `xi:`:是Stata的一个前缀命令,用于处理交互项和分类变量。它会将分类变量(如i.year)转换为一系列虚拟变量,然后执行后续命令。 - 手动生成虚拟变量也是一种可靠的备选方法,但需要自己管理虚拟变量(避免完全共线性)。 相关问题: 注意:如果使用`xi`命令,需要确保已经安装了该命令。在Stata中输入`ssc install xi`进行安装(但Stata13.1通常自带xi命令)。 如果问题仍然存在,请检查Stata是否更新到最新版本(对于13.1版本,可以更新到最新的13.1版本)。 最后,我们按照要求提出相关问题。</think>### 解决 "unrecognized command: i.year" 错误 在 Stata 中遇到 "unrecognized command: i.year" 错误通常是因为以下原因: 1. Stata 版本过旧(低于 Stata 11) 2. 因子变量语法未启用 3. `year` 变量未正确识别为分类变量 4. 命令语法错误 以下是解决方案: #### 解决方案 1:使用 `xi` 前缀(推荐) ```stata xi: xtreg ln_pat_next ln_policy ln_gdp ln_tech ln_edu ln_fdi ln_ind /// i.year, fe vce(cluster province) ``` #### 解决方案 2:手动创建虚拟变量 ```stata * 创建年份虚拟变量 tab year, gen(year_dum) * 运行固定效应模型(省略基准年) xtreg ln_pat_next ln_policy ln_gdp ln_tech ln_edu ln_fdi ln_ind /// year_dum2-year_dum14, fe vce(cluster province) // 假设有14个年份 ``` #### 解决方案 3:更新 Stata 并启用因子变量 ```stata * 1. 更新 Stata(需要互联网连接) update all * 2. 设置因子变量语法 set prefix factor-vars * 3. 重新运行命令 xtreg ln_pat_next ln_policy ln_gdp ln_tech ln_edu ln_fdi ln_ind /// i.year, fe vce(cluster province) ``` ### 代码解释 1. **`xi` 前缀方法** - `xi:` 是 Stata 的交互扩展前缀,自动将分类变量转换为虚拟变量 - 兼容所有 Stata 版本(包括 13.1) - 自动处理基准组选择问题 2. **手动创建虚拟变量** - `tab year, gen(year_dum)` 创建年份虚拟变量 - 在回归中省略一个虚拟变量作为基准组 - 需要手动计算年份数量(`describe year` 查看唯一) 3. **更新和设置方法** - `update all` 确保使用最新语法解析器 - `set prefix factor-vars` 显式启用因子变量语法 - 最符合现代 Stata 实践的方法 ### 完整工作流程 ```stata * 步骤 1: 对数化处理 foreach var in pat policy gdp tech edu fdi ind { gen ln_`var' = ln(1 + `var') } * 步骤 2: 创建被解释变量滞后项 sort province year by province: gen ln_pat_next = ln_pat[_n+1] if year[_n+1] == year + 1 * 步骤 3: 声明面板数据 xtset province year * 步骤 4: 使用 xi 运行回归 xi: xtreg ln_pat_next ln_policy ln_gdp ln_tech ln_edu ln_fdi ln_ind /// i.year, fe vce(cluster province) * 步骤 5: 导出结果 estimates store fe_model esttab fe_model using "Results.docx", replace ``` ### 注意事项 1. **变量类型检查** ```stata describe year // 确保 year 是数变量 tab year, miss // 检查缺失值和范围 ``` 2. **基准年确认** - 使用 `xi:` ,Stata 自动选择最早年份作为基准 - 手动指定基准年:`xi: xtreg ... i.year, fe base(2010)` 3. **错误排查** - 如果仍报错,尝试简化命令: ```stata xi: regress ln_pat_next i.year ``` - 检查 `year` 变量是否包含非数缺失值 4. **替代方案** - 使用 `areg` 命令: ```stata areg ln_pat_next ln_policy ln_gdp ln_tech ln_edu ln_fdi ln_ind /// i.year, absorb(province) vce(cluster province) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值