yiruia的个人博客分享 http://blog.sciencenet.cn/u/yiruia

博文

Day29 DataFrame续

已有 1779 次阅读 2020-6-4 19:46 |系统分类:科研笔记

一、DataFrame整体情况查询

df.head(3)显示头部几行,默认5行

df.tail(3)显示末尾几行,默认5行

df.info()相关信息概览:行数、列数、列索引,列非空值个数,列类型;内存占用等信息

df.descrice()快速综合统计结果:计数、均值、标准差、最大值、四分位数、最小值

d1 = {'name':['xiaohong','xiaoang'],'age':[30,32],'tel':[10086,10010]}
df = pd.DataFrame(d1)
print(df.shape) #(2, 3)
print(df.dtypes) #显示列数据类型
'''
name    object
age      int64
tel      int64
dtype: object
'''
print(df.ndim) #数据维度,2
print(df.index) # 行索引 RangeIndex(start=0, stop=2, step=1)
print(df.columns) #列索引 Index(['name', 'age', 'tel'], dtype='object')
print(df.values) #对象值,二维ndarray数值
'''
[['xiaohong' 30 10086]
 ['xiaoang' 32 10010]]
'''
print(df.head(3))
'''
       name  age    tel
0  xiaohong   30  10086
1   xiaoang   32  10010
'''
print(df.tail(1))
'''
      name  age    tel
1  xiaoang   32  10010
'''
print(df.info()) # 展示df的概览
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2 entries, 0 to 1
Data columns (total 3 columns):
name    2 non-null object
age     2 non-null int64
tel     2 non-null int64
dtypes: int64(2), object(1)
memory usage: 176.0+ bytes
None
'''
print(df.describe())
'''
             age           tel
count   2.000000      2.000000
mean   31.000000  10048.000000
std     1.414214     53.740115
min    30.000000  10010.000000
25%    30.500000  10029.000000
50%    31.000000  10048.000000
75%    31.500000  10067.000000
max    32.000000  10086.000000

动手

那么回到之前我们读取的够名字统计的数据上,我们尝试刚刚的方法

那么问题来了:

很多同学肯定想知道使用次数最高的前几个名字是什么呢?

df.sort_values(by='Count_AnimalName',ascending=False)

那么问题来了:如果我的数据有10列,我想按照其中的第1,第3,第8列排序怎么办?(看ipython的帮助文档)

df = pd.read_csv('filename')
#dataFrame中排序的方法
df.sort_values(by='Count_AnimalName',ascending=False) #by='Count_AnimalName'按照某一列排序,ascending=False表示倒序
print(df) #查看所有
print(df.head(10))#查看前10个


pandas之取行或者取列

刚刚我们知道了如何给数据按照一行或者列排序,那么现在我们想单独研究使用次数前100的数据,应该如何做?

方括号里写行表示取行,对行进行操作

方括号里写字符串表示取列索引,对列进行操作

df['Count_AnimalName']表示取列

df[:100]表示取列

df[:100]['Count_AnimalName']表示既取行又取列

那么问题来了:我们要具体选择某一列该怎么选择呢?

df['Count_AmimalName']

我们同时选择行和列该怎么办:

df[:100]['Count_AmimalName']或df['Count_AmimalName'][:100]


二、pandas之loc

还有更多经过pandas优化过的选择方法:

1、df.loc 通过标签索引行数据

2、df.iloc 通过位置获取行数据,第几行获取(0,1,2,。。。)

t3 = pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('wxyz'))
print(t3)
'''
  w  x   y   z
a  0  1   2   3
b  4  5   6   7
c  8  9  10  11
'''

# 通过索引获取数据
print(t3.loc['a','z']) #3
print(t3.loc['a'])
'''
w    0
x    1
y    2
z    3
Name: a, dtype: int32
'''
print(t3.loc[:,'y'])
'''
a     2
b     6
c    10
Name: y, dtype: int32
'''

取多行多列

t3 = pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('wxyz'))
print(t3.loc[['a','c']])
'''
   w  x   y   z
a  0  1   2   3
c  8  9  10  11
'''
print(t3.loc[['a','c'],['w','z']])
'''
   w   z
a  0   3
c  8  11
'''
print(t3.loc['a':'c',['w','z']]) #'c'行数据会被选中,冒号在loc里面是闭合的,即会选择到冒号后面的数据
'''
   w   z
a  0   3
b  4   7
c  8  11
'''

.iloc通过位置获取数据

# # 通过位置获取数据
t3 = pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('wxyz'))
print(t3.iloc[1]) # 取第二行
# ==
print(t3.iloc[1,:])
'''
w    4
x    5
y    6
z    7
Name: b, dtype: int32
'''
print(t3.iloc[:,2]) #取所有行第三列
'''
a     2
b     6
c    10
Name: y, dtype: int32
'''
print(t3.iloc[:,[2,1]]) #取所有行的第三列和第二列
'''
    y  x
a   2  1
b   6  5
c  10  9
'''
print(t3.iloc[[1,2],[2,1]]) #取第二行和第三行对应的第三列和第二列
'''
    y  x
b   6  5
c  10  9
'''

赋值更改数据的过程,先取到某个值,再进行赋值

t3 = pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('wxyz'))
t3.iloc[1:,:2] = 30
print(t3)
'''
    w   x   y   z
a   0   1   2   3
b  30  30   6   7
c  30  30  10  11
'''

t3.iloc[1:,:2] = np.nan #np.nan是float类型,在pandas中不需要转换数据类型
print(t3)
'''
     w    x   y   z
a  0.0  1.0   2   3
b  NaN  NaN   6   7
c  NaN  NaN  10  11
'''


三、pandas之布尔索引

回到之前狗的名字的问题上,假如我们想要找到所有的使用次数超过800的狗的名字,应该怎样选择?

df[df['Count_AnimalName']>800]
当有多个限制条件时
df[df[800<'Count_AnimalName']<1000] #这样写会报错,不能连续写
df[(800<df['Count_AnimalName'])&(df['Count_AnimalName']<1000])
df[(800<df['Count_AnimalName'])|(df['Count_AnimalName']<1000])
两个问题:
1. &符号表示什么?哪有其他的连接符可以使用么?
2. str是什么方法?
注意点:不同条件之间需要用括号括起来,&且,|或


四、切割

df[df['info']].str.split('/').to_list() #.to_list()能够把Series转化为列表

缺失数据的处理

我们数据缺失通常有两种情况:

一种就是空,None等,在pandas中是NaN(和np.nan一样),另一种就是我们让其为0

对于NaN的数据,在numpy中我们是如何处理的?

在pandas中我们处理起来非常容易,判断数据是否为NaN:pd.isnull(df),pd.notnull(df)

处理方式1:删除NaN所在行列dropna(axis=0,how='any',inplace=False)

处理方式2:填充数据,t.fillna(t.mean()),t.fillna(t.median()),t.fillna(0)


处理为0的数据:t[t==0]=np.nan

当然并不是每次为0的数据都需要处理

计算平均值等情况,nan是不参与计算的,但是0会参与计算

t3 = pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('wxyz'))
t3.iloc[1:,:2] = np.nan
print(t3)
# 判断是否为NaN
print(pd.isnull(t3))
print(pd.notnull(t3))
print(t3[pd.notnull(t3['w'])]) # t3中'w'这列不为NaN的行
'''
     w    x  y  z
a  0.0  1.0  2  3
'''

print(t3.dropna(axis=0)) #删除行中含有NaN的行
# ==
print(t3.dropna(axis=0,how='any')) #删除行中某列含有NaN的行
'''
     w    x  y  z
a  0.0  1.0  2  3
'''
print(t3.dropna(axis=0,how='all')) # 删除行中所有列均含有NaN的行
'''
     w    x   y   z
a  0.0  1.0   2   3
b  NaN  NaN   6   7
c  NaN  NaN  10  11
'''

print(t3.dropna(axis=0,how='any',inplace=True)) #inplace=True对原数据的就地修改,t3就替换为了删除后的数组
print(t3.fillna(100)) #之前的NaN替换为某个值
print(t3.fillna(t3.mean())) # 填充列的均值
'''
     w    x   y   z
a  0.0  1.0   2   3
b  0.0  1.0   6   7
c  0.0  1.0  10  11
'''
# print(t3['w'].fillna(t3['w'].mean())) # 单纯填充某一列,有些字符替换没什么意义(比如电话号码)
# t3['w'] = t3['w'].fillna(t3['w'].mean())
'''
a    0.0
b    0.0
c    0.0
Name: w, dtype: float64
'''

当某列数据中有NaN时,计算均值时不会将NaN计算在内,所以在爬数据的时候,没有取到值时最好不添加这个字段,或者放NaN,或者将设定的数值替换为NaN。


动手

对于一组电影数据,如果我们想rating,runtime的分布情况,应该如何呈现数据?

此代码调图花了很多时间
import pandas as pd
from matplotlib import pyplot as plt
file_path = '**.csv'
df = pd.read_csv(file_path)

# rating,runtime分布情况
#选择图形,直方图
#准备数据

runtime_data = df['Runtime(Minutes)'].values

max_runtime = runtime_data.max()
min_runtime = runtime_data.ming()

#计算组数
num_bin = (max_runtime-min_runtime)//10

# 设置图形的大小
plt.figure(figure=(20,8),dpi=80)
plt.hist(runtime_data,num_bin)

print(list(range(max_runtime,min_runtime)))
_x = [min_runtime]
i = min_runtime
while i <= max_runtime:
    i = i+0.5
    _x.append(i)

plt.xticks(_x)

plt.show()

假设现在我们有一组从2006年到2016年1000部最流行的电影数据,我们想知道电影数据评分中的平均分,导演的人数等信息,应该怎么获取?

flatten是numpy.ndarray.flatten的一个函数,即返回一个一维数组。

flatten只能适用于numpy对象,即array或者mat,普通的list列表不适用!。

a.flatten():a是个数组,a.flatten()就是把a降到一维,默认是按行的方向降 。
a.flatten().A:a是个矩阵,降维后还是个矩阵,矩阵.A(等效于矩阵.getA())变成了数组。

import pandas as pd
file_path = '**.csv'
df = pd.read_csv(file_path)
print(df.info) #看一下描述信息
print(df.head(1)) #看一下第一行数据

#获取平均评分
print(df['Rating'].mean())
# 导演的人数
print(len(set(df['Director'].tolist())))
print(len(df['Director'].unique()))

# 获取演员的人数
temp_actors_list = df['Actors'].str.split(',').tolist()
actors_list = [i for j in temp_actors_list for i in j]
# ==
# actors_list = list(np.array(temp_actors_list).flatten())
actors_num = len(set(actors_list))
print(actors_num)




https://blog.sciencenet.cn/blog-3405644-1236456.html

上一篇:Day29 pandas读取外部数据,DataFrame
下一篇:Day30 数据的合并和分组聚合
收藏 IP: 223.91.39.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-15 05:19

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部