下面的例子都以train_df举例,因为常用于观察训练集数据的特征
1、从整个DataFrame中找出数值为数字的列:
train_df.select_dtypes(include=np.number)
如果再进一步,只想获取列值为数字的列名:
train_df.select_dtypes(include=np.number).columns.values
注意,上面返回的是一个nd.array类型的数组,那么你可以转成列表来做其他的处理:
list(train_df.select_dtypes(include=np.number).columns.values)
这样就能获取某个DataFrame中的值为数值类型的列名!
2、获取DataFrame的总览信息(可以对数据有一个大体的认识,并且可以观察到是否有空缺的行)
train_df.describe().T
可以对数据有一个总览的观察
注意:这里使用了T进行转置,因为转置过后的矩阵更方便我们观察!
还有一点:这里能得到的信息只有是值为数值类型的列的信息!
3、判断DataFrame中是否有空值
train_df['列名'].isnull().any()
如果有空值,那么就返回True,否则返回False
注意:这个方法可以在数值类型的列进行处理,也适用于非数值的列!
4、获取DataFrame中到底有多少空值
train_df.isnull().values.sum()
返回值为一个具体的值!统计了在这个DataFrame中空值个数。
is_null()函数可以将train_df中的非空值替换为False,空值替换为True
然后使用values来获取一个ndarray类型的数组
最后使用sum()函数,统计里面为True的总数
总结:是一个很实用的小技巧
如果不使用values属性,可以获得下面的结果:
train_df.isnull().sum()
5、获取DataFrame中某一列为空值的行
import pandas as pd
my_data = pd.DataFrame([[1,2,3],[4,5,],[1,]])
print(my_data)
print(my_data[my_data[2].isnull()])
0 1 2
0 1 2.0 3.0
1 4 5.0 NaN
2 1 NaN NaN
0 1 2
1 4 5.0 NaN
2 1 NaN NaN
可以看到得到了第一行和第二行
6、获取DataFrame中的空值都分布在哪些列中
with pd.option_context('display.max_rows',None,'display.max_rows',None):
print(train_df.isna().sum())
7、对DataFrame中的数值列进行可视化,观察其中的空值分布
import missingno as msno
import matplotlib.pyplot as plt
#num_vals存储所有列值为数值的列名
msno.matrix(train_df[num_vals])
plt.show()
可以通过使用missingno库,对DataFrame中的数据进行可视化观察分布
8、统计一下数据集里面的标签分布,然后可视化
train_df['target'].value_counts()
上面的代码就可以对训练集的标签(target)列进行统计,可以看到标签为0的有4342个,标签为1的有3271条。
#可视化
plt.figure()
ax = train['target'].value_counts().plot.bar()
#在条形图顶部显示数字
for p in ax.patches:
print(p)
ax.annotate(np.round(p.get_height(),decimals=2),
((p.get_x()+p.get_width()/2.0),p.get_height()),
ha='center',
va='center',
xytext=(0,5),
textcoords='offset points')
plt.xticks(rotation=360)
plt.show()
9、使用replace函数,对DataFrame中的某一列值进行替换(可以用于将字符型转换为数值型)
import pandas as pd
data = {
'id':[1,2,3,4,5],
'test':['fi','fi','se','se','tu']
}
a = pd.DataFrame(data)
print(a)
id test
0 1 fi
1 2 fi
2 3 se
3 4 se
4 5 tu
这时候希望能把test列的字符型数值替换成数字,比如fi用0来替换,se用1,tu用2
可以使用replace函数来直接进行替换
a['test'] = a['test'].replace({'fi':0,'se':1,'tu':3})
print(a)
替换后的结果和我们希望的一样。
id test
0 1 0
1 2 0
2 3 1
3 4 1
4 5 3
replace的其他用法:
replace(A,B)
将A用B来替换
replace([A,B,C],D)
将A、B、C都替换成D
10、重复值处理
在dataFrame中,可能存在重复的行,这时候需要对这些重复的列进行处理,用duplicated()函数
text = train_df['text']
#显示重复的列,以及对应的标签
duplicates=train_df[text.duplicated()].sort_values(by = 'text')
这时候,虽然有了重复的行,但是处理的时候需要注意,对哪些标签既有0也有1的行进行删除
使用groupby先把这个重复的按着文本内容进行排序,接着对标签进行求均值,可以看到
conflicting_check = pd.DataFrame(duplicates.groupby(['text']).target.mean())
conflicting_check
接下来去除在conflicting_check中target不是0或者不是1的列
#删除重复的行
conflicting = conflicting_check.loc[(conflicting_check.target!=1) & (conflicting_check.target!=0)].index
conflicting
have_to_drop = train_df[text.isin(conflicting)].index
have_to_drop
最后使用drop函数,删除这些索引的行
train_df = train_df.drop(have_to_drop)
train_df