数据的合并和分组聚合

目录

数据合并

行合并  :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"]

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值