目录
行合并 :join() 行数为调用者的行数,被调用者没有的都为nan
比如统计一堆电影类型,并且统计每种类型分类情况,拿到数组,然后绘制图形
通用的方法:构造全0 的数组,列名为分类
df=pd.read_csv(r"C:\Users\xzq\PycharmProjects\untitled18\pandas课\电影.csv")
df_type=df["类型"].str.split("|").tolist()
all_type=list(set([j for i in df_type for j in i ]))
import numpy as np
import pandas as pd
df2=pd.DataFrame(np.zeros(shape=(df.shape[0],len(all_type))),index=range(df.shape[0]),columns=all_type)
for i in range(df.shape[0]):
df2.loc[i,df_type[i]]=1
print(df2)
# 逗逼 爱情 战争 科幻 戏剧
# 0 0.0 1.0 1.0 0.0 1.0
# 1 0.0 1.0 1.0 0.0 1.0
# 2 0.0 0.0 1.0 0.0 1.0
# 3 0.0 0.0 1.0 1.0 1.0
# 4 0.0 0.0 1.0 1.0 0.0
# 5 1.0 0.0 0.0 1.0 1.0
求出每一列的数量,统计绘图
绘图:略
数据合并
行合并 :join() 行数为调用者的行数,被调用者没有的都为nan
# 使 两个 DataFrame 合并在一期
df1=pd.DataFrame(np.array(range(24)).reshape(4,6),index=list("abcd"),columns=list("123456"))
df2=pd.DataFrame(np.zeros(shape=(2,4)),index=list("ab"),columns=list("ABCD"))
jiaoji=df2.join(df1) #会把行索引相同的合并在一起 行数为调用者,调用者没有的行结果不显示,调用者有,被调用者没有的行都为nan
# 1 2 3 4 5 6 A B C D
# a 0 1 2 3 4 5 0.0 0.0 0.0 0.0
# b 6 7 8 9 10 11 0.0 0.0 0.0 0.0
# c 12 13 14 15 16 17 NaN NaN NaN NaN
# d 18 19 20 21 22 23 NaN NaN NaN NaN
列合并 :
# df1
# 1 2 3 4 5 6
# a 0 1 2 3 4 5
# b 6 7 8 9 10 11
# c 12 13 14 15 16 17
# d 18 19 20 21 22 23
# df2
# 1 2 3 4
# x 0.0 0.0 0.0 0.0
# y 0.0 0.0 0.0 0.0
print(df1.merge(df2,on="1")) #一切尽在不言中 (先找出a列中 行值共同部分,然后把共同列的数据篓过来合并,你也篓我也篓)
1 2_x 3_x 4_x 5 6 2_y 3_y 4_y
# 0 0 1 2 3 4 5 0.0 0.0 0.0
# 1 0 1 2 3 4 5 0.0 0.0 0.0
how 参数:默认inner内链接 交集
改为outer 和 left 和right
#df1
# 1 2 3 4 5 6
# a 0 1 2 3 4 5
# b 6 7 8 9 10 11
# c 12 13 14 15 16 17
# d 18 19 20 21 22 23
# df2
# 1 2 3 4
# x 0.0 0.0 0.0 0.0
# y 0.0 0.0 0.0 0.0
每一行都有
1 2_x 3_x 4_x 5 6 2_y 3_y 4_y
0 0 1 2 3 4 5 0.0 0.0 0.0
1 0 1 2 3 4 5 0.0 0.0 0.0
2 6 7 8 9 10 11 NaN NaN NaN
3 12 13 14 15 16 17 NaN NaN NaN
4 18 19 20 21 22 23 NaN NaN NaN
===========================================================================================
left
调用者优先,行数随调用者
right
被调用者优先,行数随被调用者
效果和上述差不多
交叉表
分组工具 把同一个名字的索引
df=pd.DataFrame(np.arange(36).reshape(9,4),index=list([1,1,1,2,3,4,51,2,4,]),columns=list(["老王","老毛","老脏","非咋"]))
df["老王"][1,2,51]=99
print(df)
# (1列的行1,2列的行1) #(1,2)
# (1列的行2,2列的行2) # (1,2)
# 然后拿行和列 构成一个 DATAFARM
#统计同一个元祖出现的个数
# 列入上面的 则在1 ,2 值 结果为2
data=pd.crosstab(df["老王"],df["老毛"])
print(data)
聚合计数
df=pd.read_csv(r"C:\Users\xzq\PycharmProjects\untitled18\pandas课\电影.csv")
groupby_obj=df.groupby("导演") #返回一个DataFrameGroupBy对象 可以被遍历,可以使用聚合方法
# for i,n in groupby_obj : # (导演值, DATAFARM)
# print(i)
# print(type(n))
groupby_obj.count()
# 电影 票房 演员 类型
# 导演
# 谢志强 2 2 2 2
# 谢志强2 1 1 1 1
# 谢志强3 1 1 1 1
# 谢志强4 1 1 1 1
# 谢志强6 1 1 1 1
# 谢志强|谢志强6 1 1 1 1
cournt_daoyan=groupby_obj["导演"].count() #groupby_obj.count()基础上筛选列
print(cournt_daoyan["谢志强"]) #有谢志强的个数
df[cournt_daoyan["谢志强"]=3] #谢志强有3的行
聚合对象可使用的方法
obj.mean()
obj,count()
obj.group().count()
#索引
df.index #获取索引
df.index=[[],[]]
df.reindex(list("AC")) # #返回df 只展示AC两列的DataFarme
# df.set_index("a") #把a列的值剪切来作为index
# df.set_index("a",drop=False) #只使index设置为a列的values
# df["e"].unique() # e列里所有的值的集合
# df.set_index("C").index #C差看C 上的索引值
# df.set_index("C").index.unique() #C差看C 上的索引值,唯一索引(相当于集合)
#df.set_index(["A","B"]) 设置两个位置索引 #变为复合索引
# series 有复合索引怎么取值?拿到索引,交换里外层,外层适合访问,里层适合单个
# d 1 asd
# h 1 asdasasd
# d.swaplevel()["1"] #取出serrise
# b.loc["one"].loc["h"]