1.数据的合并和分组聚合(字符串离散化的案例)
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from matplotlib import pyplot as py
file_path='IMDB-Movie-Data.csv'
df=pd.read_csv(file_path)
#print(df.head(1))
print(df['Genre'])
##统计分类的列表
temp_list=df["Genre"].str.split(',').to_list() #列表嵌套列表
genre_list=list(set([i for j in temp_list for i in j]))
##构造全为0的数组
zero_df=pd.DataFrame(np.zeros((df.shape[0],len(genre_list))),columns=genre_list)
##print(zero_df)
##给每个电影出现分类的位置赋值1
for i in range(df.shape[0]):
#zeros_df.loc[0,['Sci-fi','Mucical']]=1
zero_df.loc[i,temp_list[i]]=1
#print(zero_df.head(3))
##统计每个分类的电影的数量和
print('**88888888888888888888')
genre_count=zero_df.sum(axis=0)
print(genre_list)
##排序
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,width=0.4,color="orange")
plt.xticks(range(len(_x)),_x)
plt.show()
2.数组的合并之join
join:默认情况下是把行行索引相同的数据合并到一起
df1=pd.DataFrame(np.ones((2,4)),index=['A','B'],columns=('a','b','c','d'))
print(df1)
df2=pd.DataFrame(np.zeros((3,3)),index=['A','B','C'],columns=('x','y','z'))
print(df2)
q1=df1.join(df2)
q2=df2.join(df1)
print(q1)
print(q2)
3.数据合并之merge
merge:按照指定的列把数据按照一定的方式合并到一起
inner 并集
merge outer 交集,nan补全
merge left左边为准,nan补全
merge right右边为准,nan补全
df3=pd.DataFrame(np.zeros((3,3)),columns=('f','a','x'))
print(df3)
##在默认情况下,merge取并集
q4=df1.merge(df3,on='a') ##按照a这一列取并集
print(q4)
print("%%"*50)
df4=pd.DataFrame(np.arange(9).reshape((3,3)),columns=list("fax"))
print(df4)
q5=df1.merge(df4,on="a")
print(q5)
外合并,左合并,右合并
a b c d f x
0 1.0 1.0 1.0 1.0 0 2
1 1.0 1.0 1.0 1.0 0 2
2 4.0 NaN NaN NaN 3 5
3 7.0 NaN NaN NaN 6 8
a b c d f x
0 1.0 1.0 1.0 1.0 0 2
1 1.0 1.0 1.0 1.0 0 2
a b c d f x
0 1.0 1.0 1.0 1.0 0 2
1 1.0 1.0 1.0 1.0 0 2
2 4.0 NaN NaN NaN 3 5
3 7.0 NaN NaN NaN 6 8
4.索引和复合索引
获取index: df.index
指定index:df.index={'X','Y'}
重新设置index:df.reindex(list('abcdef'))
指定某一列作为index: df.set_index('Country',drop=Faulse)
返回index的唯一值:df.set_index('Country').index.unique()
练习
#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: JMS
@file: my17.py
@time: 2022/05/27
@desc:
"""
##绘制中国每个城市
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib import font_manager
my_font=font_manager.FontProperties(fname='c:\windows\Fonts\simsun.ttc',size=10)
import numpy as np
file_path='./starbucks_store_worldwide.csv'
df=pd.read_csv(file_path)
df=df[df['Country']=='CN']
data1=df.groupby(by='City').count()['Brand'].sort_values(ascending=False)[:25]
_x=data1.index
_y=data1.values
##画图
plt.figure(figsize=(20,8),dpi=80)
plt.bar(range(len(_x)),_y,width=0.3)
plt.xticks(range(len(_x)),_x,fontproperties=my_font)
plt.show()
练习2
#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: JMS
@file: my18.py
@time: 2022/05/27
@desc:
"""
import pandas as pd
from matplotlib import pyplot as plt
file_path='./books.csv'
df=pd.read_csv(file_path)
# print(df.head(5))
#print(df.info())
##删除有缺失年份的数据,删除有缺失的字段
data1=df[pd.notnull(df['original_publication_year'])]
# grouped=data1.groupby(by='orginal_publication_year').count()['title']
##不同年份书的平均评分情况
##去除orginal_publication_year列中nan的行
grouped=data1['average_rating'].groupby(by=data1['original_publication_year']).mean()
print(grouped)
plt.figure(figsize=(20,8),dpi=80)
_x=grouped.index
_y=grouped.values
plt.plot(range(len(_x)),_y)
plt.xticks(list(range(len(_x)))[::10],_x[::10].astype(int),rotation=45)
plt.show()