[Pandas] pandas 常用操作

时间:2019-10-09
本文章向大家介绍[Pandas] pandas 常用操作,主要包括[Pandas] pandas 常用操作使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

读取 CSV 文件

可以使用 pd.read_csv() 来读取文件,pd.read_csv()的参数非常多,这里不一一介绍每个参数的含义,只对常用参数和用法做总结,全部参数可参考官方文档
常用参数:

  • filepath_or_buffer :要读取的文件路径;
  • seq:分隔符,对 csv 文件来说,每行数据分隔符为逗号,,默认值为,
  • delimiter 是 seq 的别名;
  • header:是否读入表头,header=None则不读入文件中的表头,使用默认的表头([0,1,...])

假设文件D:\\test.csv的内容如下

name,gender,1,2
tom,male,3,3
jane,female,4,4
erik,male,5,5

使用pd.read_csv()来读取文件

df = pd.read_csv('D:\\test.csv', sep=',')
df

输出

如果不需要读入表头的话,指定header=None即可

df = pd.read_csv('D:\\test.csv', header=None)
df

输出

可以看到,表头被替换成了默认的索引。

删除行

创建DataFrame

df = pd.DataFrame({'name':['jane', 'mike', 'eric'],
                   'gender': ['female', 'male', 'male'],
                   'age': [18, 19, 20]})
df.head()

输出:

删除第0行

df = df.drop(0, axis=0)  #axis=0表示按行删除
df

输出

删除第i行

df = df.drop(i, axis=0)

删除列

创建DataFrame

df = pd.DataFrame({'name':['jane', 'mike', 'eric'],
                   'gender': ['female', 'male', 'male'],
                   'age': [18, 19, 20]})
df.head()

输出:

删除第 0 列,也就是 age 列

df = df.drop(df.columns[0], axis=1)  # axis=1表示对列进行操作
df

输出

也可以指定列名删除

df = df.drop('age', axis=1)
df

输出

还可以使用del直接删除

del df['name']
df

输出

删除多列

df = df.drop(['age', 'gender'], axis=1)
df

输出

如果我们想获得删除后的列,可以使用pop函数

age = df.pop('age')
print(age)
print(df)

输出

切片

创建DataFrame

df = pd.DataFrame({'name':['jane', 'mike', 'eric'],
                   'gender': ['female', 'male', 'male'],
                   'age': [18, 19, 20]}, index=['a', 'b', 'c'])
df.head()

输出

Pandas中切片常用的有loc[]iloc[]函数。简单地说,loc根据标签来选择数据,而iloc根据索引来选择数据。

loc[]

选取第 0 行(a 对应的数据)

df.loc['a']

输出

选择第 1 行和第 2 行数据

df.loc['a':'b']

输出

同时选择行列数据

df.loc['a':'b', 'age']

输出

选择多行多列数据

df.loc['a':'b', ['age', 'name']]

输出

行也可以用列表来表示

df.loc[['a','b'], ['age', 'name']]

输出

iloc[]

iloc[]loc[]用法类似,只是iloc使用索引来进行选择和切片。
使用同样的DataFrame

df = pd.DataFrame({'name':['jane', 'mike', 'eric'],
                   'gender': ['female', 'male', 'male'],
                   'age': [18, 19, 20]}, index=['a', 'b', 'c'])
df.head()

输出

选择第 0 行

df.iloc[0]

输出

选择第 0 行和第 1 行

df.iloc[0:2]

输出

同时选择行和列

df.iloc[0:2, 0] #第0,1行,第0列(age)

输出

选取多行多列

df.iloc[0:2, [0,2]] #第0,1行,第0,2列(age, name)

输出

行索引也可以使用列表的形式

df.iloc[[0,1], [0,2]] #第0,1行,第0,2列(age, name)

输出

其他

还可以用类似访问普通数组的方式选择列

df[['name', 'gender']]

输出

NaN

创建一个含有NaN的DataFrame

df = pd.DataFrame({'name':['jane', 'mike', 'eric'],
                   'gender': ['female', 'male', np.nan],
                   'age': [18, np.nan, 20]}, index=['a', 'b', 'c'])
df.head()

输出

判断是否存在NaN

当我们拿到一份数据时,我们通常要判断数据是否有缺失,可以通过df.info()来判断

df.info()

输出

可以看到,数据共 3 行,但 age 列和 gender 列都只有 2 个数据对象。所以 age 列和 gender 列数据有缺失,各缺失 1 条数据。
还可以使用df.isnull()来判断

df.isnull()

输出

这样实际上是把每个元素是否为空都输出了出来,当数据量较大时,通过这种方法判断显然是不合理的,可以使用df.isnull().any()来判断

df.isnull().any()

输出

通过输出我们可以知道,age 列和 gender 列存在空值,而 name 列没有缺失值。
使用df.isnull().any()只能判断每列是否存在缺失值,而不能得出有多少缺失值。可以使用df.isnull().sum()来判断每列有多少缺失值

df.isnull().sum()

输出

可以看到,age 列和 gender 列各有一个缺失值,而 name 列没有缺失值。

统计NaN的比例

NaN的比例可以然我们更直观的看到有多少缺失值

total = df.isnull().sum().sort_values(ascending=False)
percent = (df.isnull().sum()/df.isnull().count()).sort_values(ascending=False)
missing_data = pd.concat([total, percent], axis=1, keys=['Total', 'Percent'])
missing_data.head()

输出

可以看到,age 列和 gender 列缺失值个数占总数的 33.3%.

缺失值的处理

当某列的缺失值较多时(缺失值比例大于等于15%),可以直接将该列删除,可以使用上面的删除列的方法将对应的列删除。
当某列的缺失值较少时,我们可以使用df.fillna()将缺失值填充,可以填充为该列其他非空值的平均值,中位数等

df['age'] = df['age'].fillna(df['age'].mean()) # 将age列中的缺失值填充为平均值
df

输出

df['gender'] = df['gender'].fillna('male') # 将gender列中的缺失值填充为'male'
df

输出

年龄应该是整数,通过astype()来更改数据类型

df['age'] = df['age'].astype(int)
df

输出

连接concat

pd.concat可以将多个DataFrame连接成一个DataFrame。
首先创建两个DataFrame:df1,df2

df1 = pd.DataFrame({'name':['jane'],
                   'gender': ['female'],
                   'age': [18]})
df1

输出

df2 = pd.DataFrame({'name':['mike'],
                   'gender': ['male'],
                   'age': [19]})
df2

输出

通过指定axis可以实现水平连接(axis=1)和垂直连接(axis=0)

df = pd.concat([df1, df2], axis=0)  #垂直连接
df

输出

df = pd.concat([df1, df2], axis=1)  #水平连接
df

输出

如果两个DataFrame的列名不同,那么连接后的DataFrame可能存在缺失值

df3 = pd.concat([df1, df2], axis=0)
df3

输出

df4 = pd.DataFrame({'name':['mike'],
                   'score':[90]})
df4

输出

将 df3 和 df4 连接

df5 = pd.concat([df3, df4], axis=0)
df5

输出

合并merge

使用pd.merge将两个DataFrame合并起来

df3

输出

df4

输出

将 df3 和 df4 根据 name 列合并

df6 = pd.merge(df3, df4, on='name')
df6

输出

还可以使用下面这种方式

df7 = df3.merge(df4)
df7

输出

$flag 上一页 下一页