python数据分析-pandas自学笔记

pandas常用数据类型

Series:一维,带标签的数组

DataFrame:二维,Series容器

1.创建Series

#使用列表生成一个Series
import pandas as pd
s = pd.Series([1, 2, 3, 4])
print(s)
'''
0    1
1    2
2    3
3    4
dtype: int64
'''
使用数组生成一个Series
import pandas as pd
import numpy as np
s  = pd.Series(np.arange(6))
print(s)
'''
0    0
1    1
2    2
3    3
4    4
5    5
dtype: int64
'''
使用列表生成序列,并且指定索引
import pandas as pd

s1 = pd.Series([1, 2, 3, 4], index=['A', 'B', 'C', 'D'])

s2 = pd.Series([1,2,3,4,5], index=list('ABCDE'))    #调用list方法将字符串转换成列表类型

print(s1)
print(s2)
'''
A    1
B    2
C    3
D    4
dtype: int64
A    1
B    2
C    3
D    4
E    5
dtype: int64
'''
使用一个字典生成Series,其中字典的键,就是索引
import pandas as pd
s = pd.Series({'name':'张三', 'age':20, 'tel':10086})
print(s)
'''
name       张三
age        20
tel     10086
dtype: object
'''

2.Series的切片和索引

import pandas as pd
s2 = pd.Series([1,2,3,4,5], index=list('ABCDE'))
print( s2['B'] )    #通过索引查找
print( s2[2] )      #通过位置查找
print( s2[s2>2] )       #通过条件查找
print( s2[:2] )     #连续位置查找
print( s2[ [1,3] ] )        #不连续位置查找
print( s2[ ['B','D'] ] )        #通过多个索引查找
'''
2
3
C    3
D    4
E    5
dtype: int64
A    1
B    2
dtype: int64
B    2
D    4
dtype: int64
B    2
D    4
dtype: int64
'''

当通过一个不存在的索引查找数据,会返回NaN

numpy中的空值:nan pandas中的空值:NaN

import pandas as pd
s = pd.Series({'name':'张三', 'age':20, 'tel':10086})
print(s.index)      #查看Series的索引
print(s.values)     #查看Series的值
print( len(s.values) )      #查看Series的长度
'''
Index(['name', 'age', 'tel'], dtype='object')
['张三' 20 10086]
3
'''

2.pandas读取外部数据

读取xxx文件,如果不指定路径就寻找当前目录

pandas.read_xxx(文件名)

python数据分析-pandas自学笔记

3.DataFrame的创建

DataFrame对象既有行索引,又有列索引

行索引:标记不同行,叫index,axis=0

列索引:标记不同列,叫columns,axis=1

pandas.DataFrame( numpy.arange(个数).reshape(行数,列数), index=, columns=)

import numpy as np
import pandas as pd
d = pd.DataFrame( np.arange(12).reshape(3,4), index=list('ABC'), columns=list('DEFG'))
print(d)
'''
   D  E   F   G
A  0  1   2   3
B  4  5   6   7
C  8  9  10  11
'''
#将字典转化成DataFrame

import numpy as np
import pandas as pd

d1 = { 'name':['xiaoming','xiaohua'],
       'age':[20,21],
       'tel':[10086,10010] }
print( pd.DataFrame(d1) )
print('-------------------------------------')

d2 = [ {'name':'xiaohong','age':32, 'tel':10010},
       {'name':'xiangming','tel':10000},
       {'name':'xiaohua','age':22} ]
print( pd.DataFrame(d2) )

'''
       name  age    tel
0  xiaoming   20  10086
1   xiaohua   21  10010
   D  E   F   G
b  4  5   6   7
c  8  9  10  11
    gene expression         description
a  gene1      low:0  transposon element
c  gene3      mid:4     retrotransposon
a     [low, 0]
b     [mid, 3]
c     [mid, 4]
d    [high, 9]
'''

df1逻辑:1. df[‘description’].str.contains(‘transposon’)筛选出含有description字段中有transposon字符串的行,返回True否则返回False。2. df[df[‘description’].str.contains(‘transposon’)]输出df中为True的行列。3. 将筛选过后的行列赋给df1

8.pandas常用统计方法

datasourse.7z – 蓝奏云资源中的IMDB-Movie-Data.csv

import numpy as np
import pandas as pd
df = pd.read_csv(r'C:\Users\LG\Desktop\data source\100电影\IMDB-Movie-Data.csv')      #导入文件
#查看字段,字段行数,字段数据类型
print(df.info())
#获取电影平均评分
print(df['Rating'].mean())
#导演的人数
print(len(set(df['Director'].tolist())))         #set()是转化成集合以去重,tolist()是转化成列表
print(len(df['Director'].unique()))       #unique()返回去重后的一个列表
print(df['Director'].nunique())
#演员的人数
actors_list = df['Actors'].str.split(',')       #每个电影的演员表生成列表,各列表再组成一个Series
actors = [i for j in actors_list for i in j]     #一层循环遍历一部电影的演员列表,另一层循环遍历一个演员列表里的每个演员
actors_sum = len(set(actors))       #set()使列表转为集合以去重,len()计算长度
print(actors_sum)
print('--------------------------')
#电影时长的最大值
max_time = df['Runtime (Minutes)'].max()        #最大时长
max_time_index = df['Runtime (Minutes)'].argmax()       #最大时长对应的索引
#电影时长的最小值
min_time = df['Runtime (Minutes)'].min()        #最小时长
min_time_index = df['Runtime (Minutes)'].argmin()       #最小时长对应的索引
#电影时长的中值
median_time = df['Runtime (Minutes)'].median()

统计每个分类下有几部电影

思路:先将所有电影类别作为表头创建一个全为0的DataFrame,遍历每部电影,在该电影属于的类别下改值为1(一部电影可能属于多个类别)

import numpy as np
import pandas as pd
df = pd.read_csv(r'C:\Users\LG\Desktop\data source\100电影\IMDB-Movie-Data.csv')
#将分类名去重提取出形成一个列表
categories_list = df['Genre'].str.split(',').tolist()       #.tolist()方法将Series转化为一个大列表内套着多个小列表
categories = list( set( i for j in categories_list for i in j))
print(categories)
#构造全为0的数组
zeros_df = pd.DataFrame(np.zeros((df.shape[0],len(categories))),columns=categories)
#给每个电影出现分类的位置赋值为1
for i in range(df.shape[0]):
    #zeros_df.loc[0, ['Sci-fi', 'Musical']] = 1,避免了双重循环
    zeros_df.loc[i,categories_list[i]] = 1
#统计每个分类的电影的数量和
count = zeros_df.sum(axis=0)
#排序
count = count.sort_values()
print(count)

9.数据合并

join根据行索引,merge根据列索引

join

将行索引相同的数据合并到一起

DataFrame1.join(DataFrame2)

(以DataFrame1的索引为主,DataFrame2多余的行去掉、少的行数据显示为NaN)

merge

DataFrame1.merge(DataFrame2, on=’字段名’,how=’连接方式’)

连接方式:

inner(默认)——交集,指定字段中相同的数据为连接,连上该行其它数据(相当于mysql的inner join)

outer——并集

right——右边为准,NaN补全

left——左边为准,NaN补全

DataFrame1.merge(DataFrame2,left_on=’1的某字段’,right_on=’2的某字段’,how=’连接方式’)

10.分组聚合

要分组的Series或DataFrame.groupby(by=’字段名’)

datasourse.7z – 蓝奏云中的星巴克directory.csv

import pandas as pd
import numpy as np
df = pd.read_csv(r'C:\Users\LG\Desktop\data source\星巴克\directory.csv')
print(df.info())

grouped = df.groupby(by='Country')      #grouped里每一个元素是一个元组
#可迭代对象
for i,j in grouped:
    print(i)
    print('-'*100)
    print(j)
    print('*'*100)
#分组后限定筛选
print(df[df['Country']=='US'])
#调用聚合方法
grouped.count()     #同个城市的所有字段分别求和
print(grouped['Brand'].count())     #可以选定某个不缺失数据的字段,避免上面那种每个字段求和值都一样

#统计美国的星巴克数量和中国哪个多
country_count = grouped['Brand'].count()
print(country_count['US'])
print(country_count['CN'])
#中国每个省份星巴克的数量情况
china_data = df[df['Country'] == 'CN']
province = china_data.groupby(by='State/Province')['Brand'].count()
print(province)

Series外嵌套一个[ ]就能使其返回成DataFrame

#数据按照多个条件进行分组,返回带有两个索引的Series
group2 = df['Brand'].groupby(by=[df['Country'],df['State/Province']]).count()
print(group2)
#数据按照多个条件进行分组,返回DataFrame
group3 = df[['Brand']].groupby(by=[df['Country'],df['State/Province']]).count()

11.索引和复合索引

获取索引

df.index

指定索引

df.index = [‘x’,’y’]

重新指定索引

df.reindex( [‘a’,’b’,’c’] ) #有这些索引的行保留,没有的填充为NaN。df中其它行删掉

指定某一列作为索引

df.set_index(‘字段名’, drop=False) #False意味着不把表头删掉,留下一个索引为表头名的空行

返回index的唯一值(索引是可以重复的)

df.set_index(‘字段名’).index.unique()

通过双索引查找数据

DataFrame之loc查找(注意 :在loc里是闭合的)

对象名.loc[ [行标签1,行标签2], 列标签]

双索引下,不能直接按内索引查找

转换内外索引后再查找

对象名.swaplevel().loc[ [行标签2] ]

12.时间序列

datasourse.7z – 蓝奏云中的911.csv

生成一段时间范围

pandas.date_range(start= , end= , periods= , freq=频率 )

python数据分析-pandas自学笔记

频率

把时间字符串转化为时间序列

df[‘时间字段名’]=pandas.to_datetime(df[‘时间字段名’],format= )

对于python无法格式化的可以通过format告诉python它的格式

13.重采样

重采样指将时间序列从从一个频率转化为另一个频率进行处理的过程。将高频率数据转化为低频率数据为降采样,低频率转化为高频率数据为升采样。

时间频率转化

DataFrame名.resample(‘频率’).聚合方法

聚合方法:.mean()、.count()等等

import numpy as np
import pandas as pd
df = pd.read_csv(r"C:\Users\LG\Desktop\data source\911\911.csv")
#统计不同月份电话次数的情况
df['timeStamp'] = pd.to_datetime(df['timeStamp'])
df.set_index('timeStamp',inplace=True)      #inplace=True意味着原地替换
count = df['title'].resample('M').count()
print(count)

Original: https://blog.csdn.net/m0_46224483/article/details/123949964
Author: ZoraAvo
Title: python数据分析-pandas自学笔记

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/678781/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球