說是定長是因為在存儲的時候,相當于兩個 ndarray,這也是和字典結構最大的不同。因為在字典的結構里,元素的個數(shù)是不固定的。 Series 有兩個基本屬性:index 和 values。在 Series 結構中,index 默認是 0,1,2,……遞增的整數(shù)序列,當然我們也可以自己來指定索引,比如 index=['a’, 'b’, 'c’, 'd’]。
!pip3 install pandas -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
# 創(chuàng)建series import pandas as pd from pandas import Series, DataFrame ## index 采用的是默認值 x1 = Series([1,2,3,4]) ## index 進行了指定 x2 = Series(data=[1,2,3,4], index=['a', 'b', 'c', 'd']) print(x1) print(x2) # 采用字典的方式來創(chuàng)建 Series d = {'a':1, 'b':2, 'c':3, 'd':4} x3 = Series(d) print (x3)
0 1 1 2 2 3 3 4 dtype: int64 a 1 b 2 c 3 d 4 dtype: int64 a 1 b 2 c 3 d 4 dtype: int64
它包括了行索引和列索引,我們可以將 DataFrame 看成是由相同索引的 Series 組成的字典類型。
import pandas as pd from pandas import Series, DataFrame data = {'Chinese': [66, 95, 93, 90,80],'English': [65, 85, 92, 88, 90],'Math': [30, 98, 96, 77, 90]} ## 相當于把每個列基于同樣地index序列化,index有點類似于主鍵??應該也可以取不唯一 df1= DataFrame(data) df2 = DataFrame(data, index=['ZhangFei', 'GuanYu', 'ZhaoYun', 'HuangZhong', 'DianWei'], columns=['English', 'Math', 'Chinese']) print(df1) print(df2)
Chinese English Math 0 66 65 30 1 95 85 98 2 93 92 96 3 90 88 77 4 80 90 90 English Math Chinese ZhangFei 65 30 66 GuanYu 85 98 95 ZhaoYun 92 96 93 HuangZhong 88 77 90 DianWei 90 90 80
Pandas 允許直接從 xlsx,csv 等文件中導入數(shù)據,也可以輸出到 xlsx, csv 等文件,非常方便。
import pandas as pd from pandas import Series, DataFrame score = DataFrame(pd.read_excel('data.xlsx')) score.to_excel('data1.xlsx') print(score)
# 報錯 XLRDError: Excel xlsx file; not supported
參考https://blog.csdn.net/weixin_44073728/article/details/111054157
pandas無法打開.xlsx文件,xlrd.biffh.XLRDError: Excel xlsx file; not supported
原因是最近xlrd更新到了2.0.1版本,只支持.xls文件。所以pandas.read_excel('xxx.xlsx’)會報錯。
可以安裝舊版xlrd,在cmd中運行:
pip uninstall xlrd
pip install xlrd==1.2.0 ##此方法解決不了
也可以用openpyxl代替xlrd打開.xlsx文件:
df=pandas.read_excel('data.xlsx’,engine='openpyxl’) ##可行
編輯data.xlsx上傳
import pandas as pd
from pandas import Series, DataFrame
score = pd.read_excel('data.xlsx',engine='openpyxl')
score.to_excel('data1.xlsx')
print(score)
66 65 30
0 95 85 98
1 93 92 96
2 90 88 77
3 80 90 90
發(fā)現(xiàn)會把Excel的首行首列讀成行列index,重新編輯上傳,執(zhí)行結果:
原來只會識別列名,每行如果不指定index還是會默認生成
Unnamed: 0 English Math Chinese
0 ZhangFei 66 65 30
1 GuanYu 95 85 98
2 ZhaoYun 93 92 96
3 HuangZhong 90 88 77
4 DianWei 80 90 90
數(shù)據清洗是數(shù)據準備過程中必不可少的環(huán)節(jié),Pandas 也為我們提供了數(shù)據清洗的工具,在后面數(shù)據清洗的章節(jié)中會給你做詳細的介紹,這里簡單介紹下 Pandas 在數(shù)據清洗中的使用方法。
import numpy as np data = {'Chinese': [66, 95, 93, 90,80],'English': [65, 85, 92, 88, 90],'Math': [30, 98, 96, 77, 90]} df = DataFrame(data, index=['ZhangFei', 'GuanYu', 'ZhaoYun', 'HuangZhong', 'DianWei'], columns=['English', 'Math', 'Chinese']) ## 1. drop()刪除 DataFrame 中的不必要的列或行 df1 = df.drop(columns=['Chinese']) df2 = df.drop(index=['ZhangFei']) print(df2) ## 2.rename(columns=new_names, inplace=True)重命名列名 columns,讓列表名更容易識別 df2.rename(columns={'Chinese': 'YuWen', 'English': 'Yingyu'}, inplace = True) ## 3.drop_duplicates()去重復的行 df3=df.drop_duplicates() print(df1) print(df2) print(df3) ## 4.astype更改數(shù)據格式 df2['YuWen'].astype('str') ##df2['YuWen'].astype(np.int64) print(df2) ## 5.strip刪除數(shù)據間的空格/指定字符 # df2['YuWen']=df2['YuWen'].map(str.strip) # df2['YuWen']=df2['YuWen'].map(str.lstrip) # df2['YuWen']=df2['YuWen'].map(str.rstrip) # df2['YuWen']=df2['YuWen'].str.strip('$') ## 6.大小寫轉換 df2.columns = df2.columns.str.upper() df2.columns = df2.columns.str.lower() df2.columns = df2.columns.str.title() ## 7.isnull()查找空值 ## 查看哪個地方存在空值 NaN,可以針對數(shù)據表 df 進行 df.isnull() ## 想知道哪列存在空值,可以使用 df.isnull().any() ## 8.apply 函數(shù)對數(shù)據進行清洗 ## 大小寫轉換df['name'] = df['name'].apply(str.upper) ## apply函數(shù)應用 def double_df(x): return 2*x df1['English'] = df1['English'].apply(double_df) ## apply復雜函數(shù)應用 def plus(df,n,m): df['new1'] = (df['English'] df['Math']) * m df['new2'] = (df['English'] df['Math']) * n return df print(df1.apply(plus,axis=1,args=(2,3,))) # 注意這里axis=0運行不了的 # 其中 axis=1 代表按照列為軸進行操作,axis=0 代表按照行為軸進行操作,args 是傳遞的兩個參數(shù),即 n=2, m=3,在 plus 函數(shù)中使用到了 n 和 m,從而生成新的 df。
English Math Chinese GuanYu 85 98 95 ZhaoYun 92 96 93 HuangZhong 88 77 90 DianWei 90 90 80 English Math ZhangFei 65 30 GuanYu 85 98 ZhaoYun 92 96 HuangZhong 88 77 DianWei 90 90 Yingyu Math YuWen GuanYu 85 98 95 ZhaoYun 92 96 93 HuangZhong 88 77 90 DianWei 90 90 80 English Math Chinese ZhangFei 65 30 66 GuanYu 85 98 95 ZhaoYun 92 96 93 HuangZhong 88 77 90 DianWei 90 90 80 Yingyu Math YuWen GuanYu 85 98 95 ZhaoYun 92 96 93 HuangZhong 88 77 90 DianWei 90 90 80 English Math new1 new2 ZhangFei 130 30 480 320 GuanYu 170 98 804 536 ZhaoYun 184 96 840 560 HuangZhong 176 77 759 506 DianWei 180 90 810 540
在數(shù)據清洗后,我們就要對數(shù)據進行統(tǒng)計了。Pandas 和 NumPy 一樣,都有常用的統(tǒng)計函數(shù),如果遇到空值 NaN,會自動排除。
# 統(tǒng)計函數(shù)千千萬,describe() 函數(shù)最簡便。它是個統(tǒng)計大禮包,可以快速讓我們對數(shù)據有個全面的了解。 df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)}) print(df1) print(df1.describe())
name data1 0 ZhangFei 0 1 GuanYu 1 2 a 2 3 b 3 4 c 4 data1 count 5.000000 mean 2.000000 std 1.581139 min 0.000000 25% 1.000000 50% 2.000000 75% 3.000000 max 4.000000
有時候我們需要將多個渠道源的多個數(shù)據表進行合并,一個 DataFrame 相當于一個數(shù)據庫的數(shù)據表,那么多個 DataFrame 數(shù)據表的合并就相當于多個數(shù)據庫的表合并
# 創(chuàng)建兩個dataframe df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)}) df2 = DataFrame({'name':['ZhangFei', 'GuanYu', 'A', 'B', 'C'], 'data2':range(5)}) ## 1.基于指定列連接 df3 = pd.merge(df1, df2, on='name') print(df3) ## 2.內連接:inner 內鏈接是 merge 合并的默認情況,inner 內連接其實也就是鍵的交集,在這里 df1, df2 相同的鍵是 name,所以是基于 name 字段做的連接 df3 = pd.merge(df1, df2, how='inner') print(df3) ## 3.左連接 df3 = pd.merge(df1, df2, how='left') print(df3) ## 4.右連接 df3 = pd.merge(df1, df2, how='right') print(df3) ## 5.外連接 df3 = pd.merge(df1, df2, how='outer') print(df3)
name data1 data2 0 ZhangFei 0 0 1 GuanYu 1 1 name data1 data2 0 ZhangFei 0 0 1 GuanYu 1 1 name data1 data2 0 ZhangFei 0 0.0 1 GuanYu 1 1.0 2 a 2 NaN 3 b 3 NaN 4 c 4 NaN name data1 data2 0 ZhangFei 0.0 0 1 GuanYu 1.0 1 2 A NaN 2 3 B NaN 3 4 C NaN 4 name data1 data2 0 ZhangFei 0.0 0.0 1 GuanYu 1.0 1.0 2 a 2.0 NaN 3 b 3.0 NaN 4 c 4.0 NaN 5 A NaN 2.0 6 B NaN 3.0 7 C NaN 4.0
工具:pandasql。 pandasql 中的主要函數(shù)是 sqldf,它接收兩個參數(shù):一個 SQL 查詢語句,還有一組環(huán)境變量 globals() 或 locals()。這樣我們就可以在 Python 里,直接用 SQL 語句中對 DataFrame 進行操作,舉個例子:
!pip3 install pandasql -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
import pandas as pd from pandas import DataFrame from pandasql import sqldf, load_meat, load_births df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)}) pysqldf = lambda sql: sqldf(sql, globals()) sql = 'select * from df1 where name ='ZhangFei'' print(pysqldf(sql))
name data1
0 ZhangFei 0
lambda argument_list: expression
lambda 實際上是用來定義一個匿名函數(shù)的,argument_list 是參數(shù)列表,expression 是關于參數(shù)的表達式,會根據 expression 表達式計算結果進行輸出返回。
對于下表的數(shù)據,請使用 Pandas 中的 DataFrame 進行創(chuàng)建,并對數(shù)據進行清洗。同時新增一列“總和”計算每個人的三科成績之和
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import pandas as pd data = {'Chinese': [66, 95, 93, 90, 80, 80], 'English': [65, 85, 92, 88, 90, 90], 'Math': [None, 98, 96, 77, 90, 90]} df = pd.DataFrame(data, index=['張飛', '關羽', '趙云', '黃忠', '典韋', '典韋'], columns=['English', 'Math', 'Chinese']) # 去除重復行 df = df.drop_duplicates() # 列名重新排序 cols = ['Chinese', 'English', 'Math'] df = df.filter(cols, axis=1) # 列名改為中文 df.rename(columns={'Chinese': '語文', 'English': '英語', 'Math': '數(shù)學'}, inplace=True) def total_score(df): df['總分'] = df['語文'] df['英語'] df['數(shù)學'] return df # 求成績的和,用老師講的 apply 方法,也可以用df['Total'] = df.sum(axis=1) df = df.apply(total_score, axis=1) # 或者可以用這個方法求和 # df['總分'] = df['語文'] df['英語'] df['數(shù)學'] # 按照總分排序,從高到低,此時有缺失值 df.sort_values(['總分'], ascending=[False], inplace=True) # 打印顯示成績單信息,張飛有空值 print(df.isnull().sum()) print(df.describe()) print(df) # 使用數(shù)學成績均值填充張飛同學的缺失值 df['數(shù)學'].fillna(df['數(shù)學'].mean(), inplace=True) # 再次求成績的和并打印顯示成績單情況 df = df.apply(total_score, axis=1) print(df.isnull().sum()) print(df.describe()) print(df)
語文 0 英語 0 數(shù)學 1 總分 1 dtype: int64 語文 英語 數(shù)學 總分 count 5.000000 5.000000 4.000000 4.000000 mean 84.800000 84.000000 90.250000 268.500000 std 11.987493 10.931606 9.464847 12.922848 min 66.000000 65.000000 77.000000 255.000000 25% 80.000000 85.000000 86.750000 258.750000 50% 90.000000 88.000000 93.000000 269.000000 75% 93.000000 90.000000 96.500000 278.750000 max 95.000000 92.000000 98.000000 281.000000 語文 英語 數(shù)學 總分 趙云 93.0 92.0 96.0 281.0 關羽 95.0 85.0 98.0 278.0 典韋 80.0 90.0 90.0 260.0 黃忠 90.0 88.0 77.0 255.0 張飛 66.0 65.0 NaN NaN 語文 0 英語 0 數(shù)學 0 總分 0 dtype: int64 語文 英語 數(shù)學 總分 count 5.000000 5.000000 5.000000 5.000000 mean 84.800000 84.000000 90.250000 259.050000 std 11.987493 10.931606 8.196798 23.911556 min 66.000000 65.000000 77.000000 221.250000 25% 80.000000 85.000000 90.000000 255.000000 50% 90.000000 88.000000 90.250000 260.000000 75% 93.000000 90.000000 96.000000 278.000000 max 95.000000 92.000000 98.000000 281.000000 語文 英語 數(shù)學 總分 趙云 93.0 92.0 96.00 281.00 關羽 95.0 85.0 98.00 278.00 典韋 80.0 90.0 90.00 260.00 黃忠 90.0 88.0 77.00 255.00 張飛 66.0 65.0 90.25 221.25
聯(lián)系客服