用Python完成以下代码:读取家长问卷数据,'data2013\cepsw1parentEN.dta',提取其中的'ids'(学生 id), 'grade9' (孩子是否为九年级), 'ba1401', 'ba1402', 'ba1403', 'ba1404', 'ba1405', 'ba1701', 'ba1702', 'ba1703', 'ba1704', 'ba1705', 'ba1706' 等列,完成相关数据清洗工作: ①删除含有缺失值的行(any)。 ②对'ba1401', 'ba1402', 'ba1403', 'ba1404', 'ba1405',请根据下表,将【1.从不 2.偶尔】记 0 分, 【3.经常】记为 1 分,并添加新列,其值为 5 个问题的得分总和。③对'ba1701', 'ba1702', 'ba1703', 'ba1704', 'ba1705', 'ba1706',请根据下表,将【1.从未做过 2. 每年一次 3.每半年一次】记 0 分,【4.每个月一次 5.每周一次 6.每周一次以上】记为 1 分, 并添加新列,其值为 6 个问题的得分总和。④删除多余的列,仅保留 4 列:【'ids', 'grade9',②得到的新列,③得到的新列】,展示表格的 前 5 行和最后 5 行的拼接。(使用 concat 和 head 和 tail 函数)
时间: 2023-10-23 21:34:27 浏览: 124
以下是代码实现:
```python
import pandas as pd
# 读取数据
data = pd.read_stata('data2013/cepsw1parentEN.dta', convert_categoricals=False)
# 提取需要的列
cols = ['ids', 'grade9', 'ba1401', 'ba1402', 'ba1403', 'ba1404', 'ba1405', 'ba1701', 'ba1702', 'ba1703', 'ba1704', 'ba1705', 'ba1706']
data = data[cols]
# 删除含有缺失值的行
data = data.dropna(how='any')
# 处理'ba1401', 'ba1402', 'ba1403', 'ba1404', 'ba1405'列
ba14_cols = ['ba1401', 'ba1402', 'ba1403', 'ba1404', 'ba1405']
ba14_scores = []
for col in ba14_cols:
score = data[col].replace({1: 0, 2: 0, 3: 1})
ba14_scores.append(score)
data['ba14_scores'] = sum(ba14_scores)
# 处理'ba1701', 'ba1702', 'ba1703', 'ba1704', 'ba1705', 'ba1706'列
ba17_cols = ['ba1701', 'ba1702', 'ba1703', 'ba1704', 'ba1705', 'ba1706']
ba17_scores = []
for col in ba17_cols:
score = data[col].replace({1: 0, 2: 0, 3: 0, 4: 1, 5: 1, 6: 1})
ba17_scores.append(score)
data['ba17_scores'] = sum(ba17_scores)
# 删除多余的列
data = data[['ids', 'grade9', 'ba14_scores', 'ba17_scores']]
# 展示前 5 行和最后 5 行的拼接
print(pd.concat([data.head(), data.tail()]))
```
需要注意的是,这段代码中对于'ba1401', 'ba1402', 'ba1403', 'ba1404', 'ba1405'和'ba1701', 'ba1702', 'ba1703', 'ba1704', 'ba1705', 'ba1706'列的处理,使用了 pandas 的 replace 函数,将原始数据中的数值映射为相应的分数。最后,使用 concat 函数将前 5 行和最后 5 行的数据拼接起来,输出结果。
阅读全文