使用pandas对数据进行处理时的DataFrame的小技巧(一)

下面的例子都以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

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值