numpy能够帮助我们处理数值,但是pandas除了处理数值之外(基于numpy),还能够帮助我们处理其他类型的数据。
一、Series和读取外部数据
Series:一维,带标签数组
import pandas as pd
t=pd.Series([1,2,31,12,3,4])
print(t)
结果:
import pandas as pd
t=pd.Series([1,2,31,12,3,4])
#可以设置标签
t1=pd.Series([1,23,2,2,1],index=list("abcde"))
print(t1)
print("*"*20)
#通过字典创建Series
temp_dict={"name":"xiaohong","age":30,"tel":10086}
t3=pd.Series(temp_dict)
print(t3)
#索引
print(t3[0]) #从0开始
print("*"*20)
print(t3[0:2]) #取不连续的
print("*"*20)
print(t3.index)
print("*"*20)
print(len(t3.index))
print("-"*20)
print(t3.values,type(t3))
结果:
Series对象本质上由两个数组构成。
一个数组构成对象的键(index,索引),一个数组构成对象的值(value),键->值
如何读取外部数据?
import pandas as pd #pandas读取csv中的文件 df=pd.read_csv("文件名") print(df)
二、DataFrame
DataFrame对象既有行索引,又有列索引
行索引,表明不同的行,横向索引,叫index,0轴,axis=0,列索引,表明不同列,纵向索引,叫columns,1轴,axis=1。
1,DataFrame创建
import numpy as np
import pandas as pd
#DataFrame 的创建
t1=pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("wxyz")) #index与columns命名标签
print(t1)
print("--"*20)
#用字典创建
t2={"name":["xiaoming","xiangang"],"age":[20,30],"tel":[10086,10010]}
print(pd.DataFrame(t2),type(pd.DataFrame(t2)))
2, DataFrame的索引
1)DataFrame的排序
df_sorted=df.sort_values(by="根据什么排序",ascending=Ture(升序))
2)DataFrame的索引
注意点:
- 方括号写数组,表示取行,对行进行操作
- 写字符串,表示的去列操作,对列进行操作
如:
df[:20] df["字符串"] df[:10]["字符串"]
3)loc与iloc的使用
import numpy as np
import pandas as pd
#DataFrame 的创建
t1=pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("wxyz")) #index与columns命名标签
print(t1)
print("--"*20)
#loc通过标签索引行数据
print(t1.loc["a","x"])
print(t1.loc["a",["x","z"]]) #一列多行
#多行多列
print(t1.loc[["a","c"],["x","z"]])
#iloc通过位置获取行数据
print(t1.iloc[0,2])
print(t1.iloc[[1,2],[2,1]])
3,pandas 常用的统计方法
4,字符串离散化
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
file_path="./movie.png"
df=pd.read_csv(file_path)
#统计分类的列表
temp_list=df["Genre"].str.split(",").tolist() #[[],[],[]]
genre_list=list(set([i for j in temp_list for i in j]))
#构造全为0的数组
zeros_df=pd.DataFrame(np.zeros((df.shape[0],len(genre_list))),columns=genre_list)
print(zeros_df)
#给每个电影出现分类的位置赋值为1
for i in range(df.shape[0]):
#zeros_df.loc[0,["Sci-fi","mucical"]]=1
zeros_df.loc[i,temp_list[i]]=1
#print(zeros_df.head(3))
#统计每个分类的电影的数量和
genre_count=zeros_df.sum(axis=0)
print(genre_count)
#排序
genre_count=genre_count.sort_values()
_x=genre_count.index
_y=genre_count.values
#画图
plt.figure(figsize=(20,8),dpi=80)
plt.bar(range(len(_x)),_y)
plt.xticks(range(len(_x)),_x)
plt.show()
结果:
5,数据的合并
1)join:默认情况下他是把行行索引相同的数据合并到一起
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
#创建t1
t1=pd.DataFrame(np.arange(10).reshape(2,5),index=list("AB"),columns=list("VWXYZ"))
print(t1)
print("--"*20)
#创建t2
t2=pd.DataFrame(np.arange(12).reshape(3,4),index=list("ABC"))
print(t2)
print("--"*20)
#join合并
t3=t1.join(t2)
print(t3)
print("--"*20)
t4=t2.join(t1)
print(t4)
结果:
注意:可以发现不同顺序的合并会导致结果不同
2)merge:按照指定的列把数据按照一定的方式合并到一起
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
#创建t1
t1=pd.DataFrame(np.arange(12).reshape(3,4),index=list("ABC"),columns=list("MNOP"))
t1[:]=1
t1.loc[["A","B","C"],"O"]=list("abc")
print(t1)
print("--"*20)
#创建t2
t2=pd.DataFrame(np.arange(10).reshape(2,5),index=list("AB"),columns=list("YWXYZ"))
t2[:]=0
t2.loc[["A","B"],"X"]=list("cd")
print(t2)
print("--"*20)
#合并之merge
print("默认情况下merge合并效果:") #默认的合并方式inner,交集
t3=t1.merge(t2,left_on="O",right_on="X")
print(t3)
print("inner效果:")
t4=t1.merge(t2,left_on="O",right_on="X",how="inner")
print(t4)
print("outer效果:") #outer并集,NaN补全
t5=t1.merge(t2,left_on="O",right_on="X",how="outer")
print(t5)
print("left效果:") #left,左边为准,NAN补全
t6=t1.merge(t2,left_on="O",right_on="X",how="left")
print(t6)
print("right效果:") #right,右边为准,NAN补全
t7=t1.merge(t2,left_on="O",right_on="X",how="right")
print(t7)
结果:
6,数据分组聚合
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
file_path="./movie.csv"
df=pd.read_csv(file_path)
grouped=df.groupby(by="Country")
#DataFrameGroupby可以遍历,也可以调用聚合方法
coutry_count=grouped["Brand"].count()
print(coutry_count["US"])
print(coutry_count["CN"])
结果:
注意:grouped是一个DataFrameGroupBy对象,是可迭代的,grouped中的每一个元素是一个元组
DataFrameGroupBy对象很多经过优化的方法:
7,索引
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
t1=pd.DataFrame(np.arange(12).reshape(3,4),index=list("ABC"),columns=list("WXYZ"))
print(t1)
print("-"*30)
#获取index
print(t1.index)
#重新设置index
print(t1.reindex(list("Abc")))
print("-"*30)
#指定某一列作为index
print(t1.set_index("W"))
print("-"*30)
print(t1.set_index("W",drop=False))