练习数据
物业编号,街道门牌号,街道名称,是否自住,卧室数量,浴室数量,房屋面积
100001000,104,和平路,是,3,1,950
100002000,197,解放路,否,3,1.5,–
100003000,建设路,否,n/a,1,850
100004000,201,人民路,5,1,NaN,700
,203,幸福路,是,3,2,1600
100006000,207,光明街,是,NA,1,800
100007000,NA,朝阳路,2,华杰,950
100008000,213,新华街,是,1,1,
100009000,215,东风路,是,na,2,1800
100010000,219,建国路,否,4,2.5,–
import pandas as pd
missing_values = ["n/a", "na", "--",""]
df = pd.read_csv('./dirty-data.csv', na_values = missing_values)
df.describe()
| 物业编号 | 街道门牌号 | 卧室数量 | 房屋面积 |
|---|
| count | 9.000000e+00 | 8.000000 | 7.000000 | 7.000000 |
|---|
| mean | 1.000056e+08 | 194.875000 | 2.428571 | 1092.857143 |
|---|
| std | 3.205897e+03 | 37.471656 | 1.133893 | 427.617987 |
|---|
| min | 1.000010e+08 | 104.000000 | 1.000000 | 700.000000 |
|---|
| 25% | 1.000030e+08 | 200.000000 | 1.500000 | 825.000000 |
|---|
| 50% | 1.000060e+08 | 205.000000 | 3.000000 | 950.000000 |
|---|
| 75% | 1.000080e+08 | 213.500000 | 3.000000 | 1275.000000 |
|---|
| max | 1.000100e+08 | 219.000000 | 4.000000 | 1800.000000 |
|---|
df.describe(include="all")
| 物业编号 | 街道门牌号 | 街道名称 | 是否自住 | 卧室数量 | 浴室数量 | 房屋面积 |
|---|
| count | 9.000000e+00 | 8.000000 | 10 | 9 | 7.000000 | 9 | 7.000000 |
|---|
| unique | NaN | NaN | 10 | 3 | NaN | 5 | NaN |
|---|
| top | NaN | NaN | 和平路 | 是 | NaN | 1 | NaN |
|---|
| freq | NaN | NaN | 1 | 5 | NaN | 4 | NaN |
|---|
| mean | 1.000056e+08 | 194.875000 | NaN | NaN | 2.428571 | NaN | 1092.857143 |
|---|
| std | 3.205897e+03 | 37.471656 | NaN | NaN | 1.133893 | NaN | 427.617987 |
|---|
| min | 1.000010e+08 | 104.000000 | NaN | NaN | 1.000000 | NaN | 700.000000 |
|---|
| 25% | 1.000030e+08 | 200.000000 | NaN | NaN | 1.500000 | NaN | 825.000000 |
|---|
| 50% | 1.000060e+08 | 205.000000 | NaN | NaN | 3.000000 | NaN | 950.000000 |
|---|
| 75% | 1.000080e+08 | 213.500000 | NaN | NaN | 3.000000 | NaN | 1275.000000 |
|---|
| max | 1.000100e+08 | 219.000000 | NaN | NaN | 4.000000 | NaN | 1800.000000 |
|---|
df.describe(percentiles=[0.3,0.6,0.9])
| 物业编号 | 街道门牌号 | 卧室数量 | 房屋面积 |
|---|
| count | 9.000000e+00 | 8.000000 | 7.000000 | 7.000000 |
|---|
| mean | 1.000056e+08 | 194.875000 | 2.428571 | 1092.857143 |
|---|
| std | 3.205897e+03 | 37.471656 | 1.133893 | 427.617987 |
|---|
| min | 1.000010e+08 | 104.000000 | 1.000000 | 700.000000 |
|---|
| 30% | 1.000034e+08 | 201.200000 | 1.800000 | 840.000000 |
|---|
| 50% | 1.000060e+08 | 205.000000 | 3.000000 | 950.000000 |
|---|
| 60% | 1.000068e+08 | 208.200000 | 3.000000 | 950.000000 |
|---|
| 90% | 1.000092e+08 | 216.200000 | 3.400000 | 1680.000000 |
|---|
| max | 1.000100e+08 | 219.000000 | 4.000000 | 1800.000000 |
|---|
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 物业编号 9 non-null float64
1 街道门牌号 8 non-null float64
2 街道名称 10 non-null object
3 是否自住 9 non-null object
4 卧室数量 7 non-null float64
5 浴室数量 9 non-null object
6 房屋面积 7 non-null float64
dtypes: float64(4), object(3)
memory usage: 688.0+ bytes
df.isnull().sum()
物业编号 1
街道门牌号 2
街道名称 0
是否自住 1
卧室数量 3
浴室数量 1
房屋面积 3
dtype: int64
dropna
df.dropna(axis=0, how=‘any’, thresh=None, subset=None, inplace=False)
axis:选择删除行还是列,axis=0(默认)表示操作行,axis=1表示操作列。
how:any表示一行/列有任意元素为空时即丢弃,all表示一行/列所有值都为空时才丢弃
thresh:axis中至少有N个非缺失值,否则删除。
subset:参数类型为列表,表示删除时只考虑的索引或列名。
inplace:是否在原数据上操作。
new_df = df.dropna()
new_df.to_string()
new_df
| 物业编号 | 街道门牌号 | 街道名称 | 是否自住 | 卧室数量 | 浴室数量 | 房屋面积 |
|---|
| 0 | 100001000.0 | 104.0 | 和平路 | 是 | 3.0 | 1 | 950.0 |
|---|
new_df = df.dropna(subset=['物业编号'])
new_df
| 物业编号 | 街道门牌号 | 街道名称 | 是否自住 | 卧室数量 | 浴室数量 | 房屋面积 |
|---|
| 0 | 100001000.0 | 104.0 | 和平路 | 是 | 3.0 | 1 | 950.0 |
|---|
| 1 | 100002000.0 | 197.0 | 解放路 | 否 | 3.0 | 1.5 | NaN |
|---|
| 2 | 100003000.0 | NaN | 建设路 | 否 | NaN | 1 | 850.0 |
|---|
| 3 | 100004000.0 | 201.0 | 人民路 | 5 | 1.0 | NaN | 700.0 |
|---|
| 5 | 100006000.0 | 207.0 | 光明街 | 是 | NaN | 1 | 800.0 |
|---|
| 6 | 100007000.0 | NaN | 朝阳路 | NaN | 2.0 | 华杰 | 950.0 |
|---|
| 7 | 100008000.0 | 213.0 | 新华街 | 是 | 1.0 | 1 | NaN |
|---|
| 8 | 100009000.0 | 215.0 | 东风路 | 是 | NaN | 2 | 1800.0 |
|---|
| 9 | 100010000.0 | 219.0 | 建国路 | 否 | 4.0 | 2.5 | NaN |
|---|
pd.fillna
pd.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
value:用于填充的空值的值。
method: {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None},
default None。定义了填充空值的方法,
pad / ffill表示用前面行/列的值,填充当前行/列的空值,
backfill / bfill表示用后面行/列的值,填充当前行/列的空值。
axis:轴。0或’index’,表示按行删除;1或’columns’,表示按列删除。
inplace:是否原地替换。布尔值,默认为False。如果为True,则在原DataFrame上进行操作,返回值为None。
limit:int, default None。如果method被指定,对于连续的空值,这段连续区域,最多填充前 limit 个空值(如果存在多段连续区域,每段最多填充前 limit 个空值)。如果method未被指定, 在该axis下,最多填充前 limit 个空值(不论空值连续区间是否间断)
downcast:dict, default is None,字典中的项为,为类型向下转换规则。或者为字符串“infer”,此时会在合适的等价类型之间进行向下转换,比如float64 to int64 if possible。
df['物业编号'] = df['物业编号'].fillna('未知编号')
df.head()
| 物业编号 | 街道门牌号 | 街道名称 | 是否自住 | 卧室数量 | 浴室数量 | 房屋面积 |
|---|
| 0 | 100001000.0 | 104.0 | 和平路 | 是 | 3.0 | 1 | 950.0 |
|---|
| 1 | 100002000.0 | 197.0 | 解放路 | 否 | 3.0 | 1.5 | NaN |
|---|
| 2 | 100003000.0 | NaN | 建设路 | 否 | NaN | 1 | 850.0 |
|---|
| 3 | 100004000.0 | 201.0 | 人民路 | 5 | 1.0 | NaN | 700.0 |
|---|
| 4 | 未知编号 | 203.0 | 幸福路 | 是 | 3.0 | 2 | 1600.0 |
|---|
to_numeric
pandas.to_numeric(arg, errors=‘raise’, downcast=None)
arg: 待转换的数据,可以是Series、DataFrame、列表、数组等。
errors: 控制遇到无法转换的值时的处理方式,可选值包括’raise’(默认,抛出异常)、‘coerce’(将无法转换的值设置为NaN)和’ignore’(保留原始值)。
downcast: 控制数值类型的转换,可选值包括’integer’、‘signed’、‘unsigned’、‘float’,用于降低数据类型的精度。
df['街道门牌号'] = pd.to_numeric(df['街道门牌号'], errors='coerce')
df['街道门牌号'] = df['街道门牌号'].fillna(df['街道门牌号'].median())
df.head()
| 物业编号 | 街道门牌号 | 街道名称 | 是否自住 | 卧室数量 | 浴室数量 | 房屋面积 |
|---|
| 0 | 100001000.0 | 104.0 | 和平路 | 是 | 3.0 | 1 | 950.0 |
|---|
| 1 | 100002000.0 | 197.0 | 解放路 | 否 | 3.0 | 1.5 | NaN |
|---|
| 2 | 100003000.0 | 205.0 | 建设路 | 否 | NaN | 1 | 850.0 |
|---|
| 3 | 100004000.0 | 201.0 | 人民路 | 5 | 1.0 | NaN | 700.0 |
|---|
| 4 | 未知编号 | 203.0 | 幸福路 | 是 | 3.0 | 2 | 1600.0 |
|---|
df['是否自住'] = df['是否自住'].fillna(df['是否自住'].mode())
df.head()
| 物业编号 | 街道门牌号 | 街道名称 | 是否自住 | 卧室数量 | 浴室数量 | 房屋面积 |
|---|
| 0 | 100001000.0 | 104.0 | 和平路 | 是 | 3.0 | 1 | 950.0 |
|---|
| 1 | 100002000.0 | 197.0 | 解放路 | 否 | 3.0 | 1.5 | NaN |
|---|
| 2 | 100003000.0 | 205.0 | 建设路 | 否 | NaN | 1 | 850.0 |
|---|
| 3 | 100004000.0 | 201.0 | 人民路 | 5 | 1.0 | NaN | 700.0 |
|---|
| 4 | 未知编号 | 203.0 | 幸福路 | 是 | 3.0 | 2 | 1600.0 |
|---|
df['卧室数量'] = df['卧室数量'].replace(['n/a', 'na', 'NA'], pd.NA)
df['卧室数量'] = pd.to_numeric(df['卧室数量'], errors='coerce')
df['卧室数量'] = df['卧室数量'].fillna(df['卧室数量'].median()).astype(int)
df.head()
| 物业编号 | 街道门牌号 | 街道名称 | 是否自住 | 卧室数量 | 浴室数量 | 房屋面积 |
|---|
| 0 | 100001000.0 | 104.0 | 和平路 | 是 | 3 | 1 | 950.0 |
|---|
| 1 | 100002000.0 | 197.0 | 解放路 | 否 | 3 | 1.5 | NaN |
|---|
| 2 | 100003000.0 | 205.0 | 建设路 | 否 | 3 | 1 | 850.0 |
|---|
| 3 | 100004000.0 | 201.0 | 人民路 | 5 | 1 | NaN | 700.0 |
|---|
| 4 | 未知编号 | 203.0 | 幸福路 | 是 | 3 | 2 | 1600.0 |
|---|
df['房屋面积'] = df['房屋面积'].replace('--', pd.NA)
df['房屋面积'] = pd.to_numeric(df['房屋面积'], errors='coerce')
df['房屋面积'] = df['房屋面积'].fillna(round(df['房屋面积'].mean())).astype(int)
df
| 物业编号 | 街道门牌号 | 街道名称 | 是否自住 | 卧室数量 | 浴室数量 | 房屋面积 |
|---|
| 0 | 100001000.0 | 104.0 | 和平路 | 是 | 3 | 1 | 950 |
|---|
| 1 | 100002000.0 | 197.0 | 解放路 | 否 | 3 | 1.5 | 1093 |
|---|
| 2 | 100003000.0 | 205.0 | 建设路 | 否 | 3 | 1 | 850 |
|---|
| 3 | 100004000.0 | 201.0 | 人民路 | 5 | 1 | NaN | 700 |
|---|
| 4 | 未知编号 | 203.0 | 幸福路 | 是 | 3 | 2 | 1600 |
|---|
| 5 | 100006000.0 | 207.0 | 光明街 | 是 | 3 | 1 | 800 |
|---|
| 6 | 100007000.0 | 205.0 | 朝阳路 | NaN | 2 | 华杰 | 950 |
|---|
| 7 | 100008000.0 | 213.0 | 新华街 | 是 | 1 | 1 | 1093 |
|---|
| 8 | 100009000.0 | 215.0 | 东风路 | 是 | 3 | 2 | 1800 |
|---|
| 9 | 100010000.0 | 219.0 | 建国路 | 否 | 4 | 2.5 | 1093 |
|---|
def fix_own_occupied(x):
if x in ['是', '否']:
return x
else:
return '未知'
df['是否自住'] = df['是否自住'].apply(fix_own_occupied)
df['浴室数量'] = df['浴室数量'].replace('HURLEY', pd.NA)
df['浴室数量'] = pd.to_numeric(df['浴室数量'], errors='coerce')
df['浴室数量'] = df['浴室数量'].fillna(round(df['浴室数量'].mean(), 1))
df
| 物业编号 | 街道门牌号 | 街道名称 | 是否自住 | 卧室数量 | 浴室数量 | 房屋面积 |
|---|
| 0 | 100001000.0 | 104.0 | 和平路 | 是 | 3 | 1.0 | 950 |
|---|
| 1 | 100002000.0 | 197.0 | 解放路 | 否 | 3 | 1.5 | 1093 |
|---|
| 2 | 100003000.0 | 205.0 | 建设路 | 否 | 3 | 1.0 | 850 |
|---|
| 3 | 100004000.0 | 201.0 | 人民路 | 未知 | 1 | 1.5 | 700 |
|---|
| 4 | 未知编号 | 203.0 | 幸福路 | 是 | 3 | 2.0 | 1600 |
|---|
| 5 | 100006000.0 | 207.0 | 光明街 | 是 | 3 | 1.0 | 800 |
|---|
| 6 | 100007000.0 | 205.0 | 朝阳路 | 未知 | 2 | 1.5 | 950 |
|---|
| 7 | 100008000.0 | 213.0 | 新华街 | 是 | 1 | 1.0 | 1093 |
|---|
| 8 | 100009000.0 | 215.0 | 东风路 | 是 | 3 | 2.0 | 1800 |
|---|
| 9 | 100010000.0 | 219.0 | 建国路 | 否 | 4 | 2.5 | 1093 |
|---|
修改数据类型
df['物业编号'] = df['物业编号'].astype(str)
df['街道门牌号'] = df['街道门牌号'].astype(int)
df
| 物业编号 | 街道门牌号 | 街道名称 | 是否自住 | 卧室数量 | 浴室数量 | 房屋面积 |
|---|
| 0 | 100001000.0 | 104 | 和平路 | 是 | 3 | 1.0 | 950 |
|---|
| 1 | 100002000.0 | 197 | 解放路 | 否 | 3 | 1.5 | 1093 |
|---|
| 2 | 100003000.0 | 205 | 建设路 | 否 | 3 | 1.0 | 850 |
|---|
| 3 | 100004000.0 | 201 | 人民路 | 未知 | 1 | 1.5 | 700 |
|---|
| 4 | 未知编号 | 203 | 幸福路 | 是 | 3 | 2.0 | 1600 |
|---|
| 5 | 100006000.0 | 207 | 光明街 | 是 | 3 | 1.0 | 800 |
|---|
| 6 | 100007000.0 | 205 | 朝阳路 | 未知 | 2 | 1.5 | 950 |
|---|
| 7 | 100008000.0 | 213 | 新华街 | 是 | 1 | 1.0 | 1093 |
|---|
| 8 | 100009000.0 | 215 | 东风路 | 是 | 3 | 2.0 | 1800 |
|---|
| 9 | 100010000.0 | 219 | 建国路 | 否 | 4 | 2.5 | 1093 |
|---|