導航:首頁 > 編程語言 > pythondf排序

pythondf排序

發布時間:2023-10-21 02:52:48

python基礎命令都有什麼

(1)打開csv文件
import pandas as pd
df=pd.read_csv(r』data/data.csv』)
(2)dataframe index 重新排序
data=df.sort_index(axis=0,ascending=False)
(3)dataframe 按照某一列進行升序或者降序排列
data=df.sort([『date』],ascending=True升序,False降序)
(4)dataframe 的index重新從0開始
data=data.reset_index(drop=True)
(5)畫橫坐標是日期的圖
import matplotlib.pyplot as plt
x=data[『date』]#日期是字元串形式
y=data[『close price』]
plt.plot_date(x,y)
(6)求標准差
import numpy as np
np.std
(7)下取整
import math
math.floor
上取整:math.ceil
(8)希爾伯特變換
from scipy import fftpack
hx= fftpack.hilbert(price)
(9)值排序
data.order()
(10)差分
data.diff(1)#一階差分
dataframe 刪除元素
data.drop(元素位置)
(11)嵌套的array處理方法
import itertools
a = [[1,2,3],[4,5,6], [7], [8,9]]
out = list(itertools.chain.from_iterable(a))
(12)dataframe修改列名
data.columns=[『num』,』price』]
(13)excel表導入以後有空行解決辦法
import numpy as np
data= data.drop(data.loc[np.isnan(data.name.values)].index)
(15)diff用法
一.是dataframe或者series格式,直接就用data.diff()
二.是list格式,先轉換成轉換成list格式data=data.tolist() 然後dif=np.diff(data)
(16)dataframe中的日期type不是date格式,不能直接相加減,所以先轉換成list格式
t=data.time.tolist()
date_time = datetime.datetime.strptime(str(t),』%Y-%m-%d %H:%M:%S』)
date_time=datetime.date(date_time.year,date_time.month,date_time.day)
past= date_time - datetime.timedelta(days=n*365)
(17)符號化
np.sign
(18)字典的使用
label={『11』:』TP』,』1-1』:』FN』,』-11』:』FP』,』-1-1』:』TN』}
for i in range(len(data1)):
state=str(int(data1[i]))+str(int(data2[i]))
result.append(label[state])
(19)用plt畫圖的時候中文不顯示的解決辦法
from matplotlib.font_manager import FontProperties
font_set = FontProperties(fname=r」c:windowsontssimsun.ttc」, size=15)
plt.title(u』中文』, fontproperties=font_set)
(20)獲取當前程序運行的時間
from time import time
time1=time()
time2=time()
print(time2-time1)
以上是我找到的資料,對於我這個學習Python到半吊子的人來說也是要收藏起來的。

② Python對數據進行排序-中英文

sort_values(by,axis=0,ascending=True,inplace=False,kind='quicksort',na_position='last')

參數說明:

by:  可以填入字元串或者字元串組成的列表。也就是說, 如果axis=0,那麼by="列名";如果axis=1,那麼by="行名"。

axis:  {0 or 『index』, 1 or 『columns』}, default 0,意思就是如果 axis=0,就按照索引排序,即縱向排序;如果axis=1,則按列排序,即橫向排序。默認是axis=0 。

ascending:  輸入布爾型, True是升序 , False是降序 ,也可以可以是[True,False],即第一個欄位升序,第二個欄位降序 。

inplace : 輸入布爾型,是否用排序後的數據框替換現有的數據框

kind:  排序的方法,{『quicksort』, 『mergesort』, 『heapsort』},默認是使用『quicksort』。這個參數用的比較少,大家可以試一試。

na_position :  {『first』, 『last』}, 缺失值的排序 ,也就說決定將缺失值放在數據的最前面還是最後面 。first是排在前面,last是排在後面,默認是用last 。

例子:

scores= pd.DataFrame([[87,56,85],[46,87,97],[34,65,86]],columns=['jack', 'rose', 'mike'])

scores

1.對『rose』這一列進行降序排序:

df_sc=scores.sort_values(by='rose',ascending=False)

df_sc

2.對第0行進行升序排序:

scores.sort_values(by=0,axis=1,ascending=True)

3.第1行進行升序,第0行進行降序:

scores.sort_values(by=[1,0],axis=1,ascending=[True,False]

4.觀察數據

data.head:

查看數據的前五行。

data.tail:

查看數據的後五行。

data.shape :

查看矩陣或數組的維數,或者是說數據表的結構(有幾行幾列)。

data.info :

查看數據的基本信息,如:數據類型、缺失值數量等。

#brand目標:中文-中英-英文

2.1 包含中文,純英文

for i in range(0,len(file1)):

    result = re.compile(u'[\u4e00-\u9fa5]')

    contents = file1['brand'][i]

    match = result.search(contents)

    if match:

        file1.loc[i,['index1']]=0    #0為包含中文

    else:

        file1.loc[i,['index1']]=1    #1為純英文

2.1 包含英文,純中文

for i in range(0,len(file1)):

    file1.loc[i,['index2']]=len(re.findall('[a-zA-Z]+', file1['brand'][i]) )  #0為純中文,1為包含英文

③ 數據分析員用python做數據分析是怎麼回事,需要用到python中的那些內容,具體是怎麼操作的

大數據!大數據!其實是離不開數據二字,但是總體來講,自己之前對數據的認知是不太夠的,更多是在關注技術的提升上。換句話講,自己是在做技術,這些技術處理的是數據,而不能算是自己是在做數據的。大規模數據的處理是一個非常大的課題,但是這一點更偏向於是搞技術的。

與數據分析相關的Python庫很多,比如Numpy、pandas、matplotlib、scipy等,數據分析的操作包括數據的導入和導出、數據篩選、數據描述、數據處理、統計分析、可視化等等。接下來我們看一下如何利用Python完成數據的分析。
生成數據表
常見的生成方法有兩種,第一種是導入外部數據,第二種是直接寫入數據,Python支持從多種類型的數據導入。在開始使用Python進行數據導入前需要先導入pandas庫,為了方便起見,我們也同時導入Numpy庫。代碼是最簡模式,裡面有很多可選參數設置,例如列名稱、索引列、數據格式等等。
檢查數據表
Python中使用shape函數來查看數據表的維度,也就是行數和列數。你可以使用info函數查看數據表的整體信息,使用dtypes函數來返回數據格式。Isnull是Python中檢驗空值的函數,你可以對整個數據表進行檢查,也可以單獨對某一列進行空值檢查,返回的結果是邏輯值,包含空值返回True,不包含則返回False。使用unique函數查看唯一值,使用Values函數用來查看數據表中的數值。
數據表清洗
Python中處理空值的方法比較靈活,可以使用Dropna函數用來刪除數據表中包含空值的數據,也可以使用fillna函數對空值進行填充。Python中dtype是查看數據格式的函數,與之對應的是astype函數,用來更改數據格式,Rename是更改列名稱的函數,drop_plicates函數刪除重復值,replace函數實現數據替換。
數據預處理
數據預處理是對清洗完的數據進行整理以便後期的統計和分析工作,主要包括數據表的合並、排序、數值分列、數據分組及標記等工作。在Python中可以使用merge函數對兩個數據表進行合並,合並的方式為inner,此外還有left、right和outer方式。使用ort_values函數和sort_index函數完成排序,使用where函數完成數據分組,使用split函數實現分列。
數據提取
主要是使用三個函數:loc、iloc和ix,其中loc函數按標簽值進行提取,iloc按位置進行提取,ix可以同時按標簽和位置進行提取。除了按標簽和位置提起數據以外,還可以按具體的條件進行數據,比如使用loc和isin兩個函數配合使用,按指定條件對數據進行提取。
數據篩選匯總
Python中使用loc函數配合篩選條件來完成篩選功能,配合sum和 count函數還能實現excel中sumif和countif函數的功能。Python中使用的主要函數是groupby和pivot_table。groupby是進行分類匯總的函數,使用方法很簡單,制定要分組的列名稱就可以,也可以同時制定多個列名稱,groupby 按列名稱出現的順序進行分組。

④ 數據蛙-Python進階

這是漫長的一周,本周完成了Python的進階模塊,主要是pandas、numpy、matplotlib、seaborn、pyecharts這些模塊的學習以及一個實際的案例:商品銷售情況分析,之前一直覺得課程難度不夠,但到這一周難度就大大提高了。尤其是案例練習中的RFM模型和用戶生命周期建立,看懂不難但是自差首己寫一直出錯,在不斷出錯不斷嘗試中知識得到了積累,另外可視化部分沒有什麼練習題,希望後面可以加上一些這方面的練習,接下來分模塊來總結一下學習的內容。

重新設置索引:df.set_index()

Series格式轉換為DataFrame:df.to_frame()

文件讀取:pd.read_csv(filepath, header = 0,skiprows=[1,2]) 

使用位禪慶源置做索引:df.loc[0]        使用列表做索引:df.loc[[0,1,2]]

使用切片做索引:df.loc[0:4]        使用bool類型索引:df[df['年齡']>30]

loc 是基於索引值的,切片是左閉右閉的

iloc 是基於位置的,切片是左閉右開的

修改列索引:df.rename(columns={'姓名':'name', '年齡':'age'},inplace=True)

替換一個值:df.replace({'name':{'小明':'xiaoming'}},inplace=True)

對數據進行排序:df.sort_values('age')

累加求和:df.cumsum(0)

刪除列:del df['player']         刪除行:df.drop(labels=0) labels 是行列的名字

數據拼接:pd.concat([left,right],axis=1)

# 指定列進行關聯,默認是 inner join     result = pd.merge(left,right,on='key')

#多個關聯條件:result = pd.merge(left, right, on=['key1', 'key2'])

#左連接:result = pd.merge(left, right, how='left', on=['key1', 'key2'])

# 列名不一樣的關聯:pd.merge(left,right,left_on = ['key1','key2'],right_on = ['key3','key4'])

#單個分組:groups = df.groupby('district')

# 作用多個聚合函數:groups.agg([np.mean,np.sum,np.std])

# 針對具體列聚合 groups.age.agg([np.mean,np.sum,np.std])

# 不同列不同聚合函數 groups.agg({"age":np.mean,"novip_buy_times":np.sum})

分組後該列值求和顯示:groups['vip_buy_times'].transform('sum')

通常用於求佔比:transform(lambda x: x /sum(x))

# 填充指定值:np.full([3,4],1)

# 起始為10,5為步長,30為結賀態尾取不到:np.arange(10, 30, 5)

#隨機矩陣:np.random.random((2,3))

# 平均劃分:np.linspace( 0, 2*pi, 100 )

# 類型及轉換:vector.astype('float')

# 多維變一維:matrix.ravel()

# 矩陣的擴展:a = np.arange(0, 40, 10)    b = np.tile(a, (3, 5))    # 行變成3倍,列變成5倍

# 水平拼接:np.hstack((a,b))  豎直拼接:np.vstack((a,b))

# 豎直分割:np.hsplit(a,3)    #水平分割:np.vsplit(a,3)

8. Select the data in rows [3, 4, 8] and in columns ['animal', 'age'].

A:df.loc[df.index[[3,4,8]],['animal','age']]

行採用位置,列採用普通索引,這里利用index函數將位置變化為具體的普通索引,再利用loc函數

19. The 'priority' column contains the values 'yes' and 'no'. Replace this column with a column of boolean values: 'yes' should be True and 'no' should be False

A1:df['priority'].replace(['yes','no'],[True,False],inplace=True) 用replace函數替換

A2:df['priority'] = df['priority'].map({'yes': True, 'no': False}) 用map函數替換

最大最小值的索引:df.idxmax、df.idxmin

找出最大最小的前N個數:nlargest()和nsmallest() 

將原表分組 並設置分段區間 pd.cut(df['A'], np.arange(0, 101, 10))

resample函數 日期重采樣:s.resample('M').mean()

TimeGrouper 重組:s.groupby(pd.TimeGrouper('4M')).idxmax()

split 分割函數:temp = df['From_To'].str.split('_', expand=True) True為DataFrame

兩個DataFrame拼接用join:df = df.join(temp)

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標簽

plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號

%matplotlib inline 直接顯示

折線圖:plt.plot(x,y,color = 'r')

柱狀圖:plt.bar(x,y)  plt.barh(x,y) 多個bar x設置不同 堆積圖 bottom設置不同

散點圖:plt.scatter(x, y, c=colors, alpha=0.5, s = area)

直方圖:plt.hist(a,bins= 20) bin代表分隔的最小單位

plt.legend() 顯示圖例

for a,b in zip(X+W[i],data[i]):

    plt.text(a,b,"%.0f"% b,ha="center",va= "bottom") 添加數據標簽

plt.annotate('注釋文本',xy=(1, np.sin(1)),xytext=(2, 0.5), fontsize=16,arrowprops=dict(arrowstyle="->")) 添加註釋文本

plt.xlabel("Group") x軸標題

plt.ylabel("Num") y軸標題

fig, axes = plt.subplots(nrows=2, ncols=2,facecolor='darkslategray')  繪制多個圖形

axes[0,0] axes[0,1] axes[1,0] axes[1,1]

pylab.rcParams['figure.figsize'] = (10, 6) # 調整圖片大小

動態展示圖表

from pyecharts.charts import Bar

from pyecharts import options as opts

** pyecharts 繪圖的五個步驟:**

創建圖形對象:bar = Bar()

添加繪圖數據:bar.add_xaxis(["襯衫", "毛衣", "領帶", "褲子", "風衣", "高跟鞋", "襪子"])

                         bar.add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])

                         bar.add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])

配置系列參數:對標簽、線型等的一些設置

配置全局參數:bar.set_global_opts(title_opts=opts.TitleOpts(title="銷售情況"))

渲染圖片:生成本地 HTML 文件 bar.render("mycharts.html")  bar.render()

notebook 渲染:bar.render_notebook()

bar = (Bar()

    .add_xaxis(["襯衫", "毛衣", "領帶", "褲子", "風衣", "高跟鞋", "襪子"])

    .add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])

    .add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])

    .set_global_opts(title_opts=opts.TitleOpts(title="某商場銷售情況"))

)

bar.render_notebook()

柱狀圖:Bar()

條形圖:bar.reversal_axis() #翻轉XY軸,將柱狀圖轉換為條形圖

折線圖:from pyecharts.charts import Line  line=Line()

餅圖:from pyecharts.charts import Page, Pie    Pie() 

轉換日期類型:df['order_dt']=pd. to_datetime (df.order_dt,format="%Y%m%d")

將日期轉換為月為單位:df['month']=df.order_dt.values. astype('datetime64[M]') 所有日期顯示為當月第一天

去除日期單元值:order_diff/ np.timedelta64(1,'D')

過濾部分極值:grouped_user.sum() .query('order_procts<100') .order_amount

數據透視表:rfm=df.pivot_table( index ='user_id', values =['order_procts','order_amount'], aggfunc ={'order_amount':'sum','order_procts':'sum'})

map() 方法是pandas.series.map()方法, 對DF中的元素級別的操作, 可以對df的某列或某多列

applymap(func) 也是DF的屬性, 對整個DF所有元素應用func操作

purchase_r=pivoted_counts.applymap(lambda x: 1 if x>1 else np.NaN if x==0 else 0)

apply(func) 是DF的屬性, 對DF中的行數據或列數據應用func操作,也可用於Series

apply(lambda x:x.cumsum()/x.sum())    累計佔比

apply(lambda x:x/x.sum(),axis=0)     每一列中每行數據佔比

下周開始進入數據分析思維的課程,很期待後面的課程以及項目,加油!

⑤ pandas常用函數匯總

pandas官方文檔:http://pandas.pydata.org/pandas-docs/stable/api.html

對常用函數做了匯總,每個函數的參數可能不是全的,但是常用的,不常用的沒總結,如有問題,請不吝賜教,謝謝!

1、創建Series

      通用函數:pd.Series(values,index)

     1)pd.Series([1,2,3],index=[『a』,『b』,『c『])

     2)pd.Series(np.array([1,2,3]),index=[『a』,『b』,『c『])

     3)pd.Series({ 'a':1,  'b':2,  'c':3})

        Series轉字典:Series.to_dict()

     說明:Series的values參數是python中常見的一維數據類型。

2、屬性李此攔

     1)Series.values --->array([1,2,3])

           Series的values是array類型

     2)Series.index--->index([『a』,『b』,『c『])

           未指定index時,自動生成 0-(N-1)的整數索引,

           指定 index時,使用指定索引。

 3、Series的索引與切片

       Series[0] / Series['a']  : Sereis可以位置索引或標簽索引,也可以進行切片操作

1、創建DataFrame

    1) 創建DataFrame的通用函數:

     df = pd.DataFrame(values,index,columns)

     pd.dataFrame([[1,2,3],[4,5,6],[7,8,9]],index=['a','b','c'],columns=['bj','sh','sz'])

     pd.dataFrame(np.arange(1,10).reshape(3,3),index=['a','b','c'],columns=['bj','sh','sz'])

     pd.dataFrame('bj':[1,4,7],'sh':[2,5,8],'sz':[3,6,9],index=['a','b','c'])

說明:創建方法與Sries類似,Series的values參數是python中常見的一維數據類型,DataFrame的values參數是python中常見的二維數據類型。

    2) 通過網頁中復制數據快捷創建

        import webbrowser

        link = 'https://www.tiobe.com/tiobe-index/'

        webbrowser.open(link)

        打開界面進行復扒做制,將數據復制到粘貼板中

        df = pd.read_clipboard()   #從粘貼板中讀取數據

    3)通過Series創建DataFrame

        df = pd.DataFrame([s1,s2,s3],columns=['bj','sh','sz'])

        注意:單獨的s1,s2,s3是縱向排列的的Series,但是在DataFrame中是橫向排列的。

        自己總結:Series除了列印出來是Series格式外,其他時候可以直接當作list來操作。

2、屬性

     1)df.columns

        通過columns生成新的DataFrame

        df_new = pd.DataFrame(df,columns=['x1','x2'])

       哪胡 或者df_new = df[['x1','x2']]

    2)df.shape  顯示行列數

    3)df.head()   默認顯示前5行

    4)df.tail()     默認顯示後5行

3、獲取DataFrame的列

     1)獲取DataFrame某一列

          df.x1或df['x1']:返回值是Series,可以理解為一個DataFrame是由多個Series組成的。

      2) 獲取DataFrame某幾列

          df_new = df[['x1','x2','x3']]

4、為某列賦值

      1) df['x1'] = range(10)

      2) df['x1'] = numpy.arange(10)

      3) df['x1'] = pd.Series(np.arange(10))

      說明:類似於創建Series

 5、為某列對應的特定行重新賦值

        df['x1'] = pd.Series([2,3],index=[0,1])

        將列為x1,行索引為0和1的值改為2,3

 6、獲取DadaFrame的行

      for row in DataFrame.iterrows():

              print(row[0],row[1])

      #每個row是一個元祖,包含2個元素,row[0]是整型索引,row[1]是Series,所以從行的角度也可以看出,一個DataFrame是由多個Series組成的。

 7、DataFrame的轉置

      df_new = df.T

1、粘貼板的io

      df = pd.read_clipboard()

      df.to_clipboard()

 2、csv的io

       df.to_csv('xxx.csv')

       df = pd.read_csv('xxx.csv')

  3、json的io

       df.to_json()

       pd.read_json(df.to_json())

   4、excel的io

        df.to_excel('xx.xlsx')

        df = pd.read_excel('xx.xlsx')

   5、df = pd.read_sql('')

        df.to_sql('')

 1、iloc

      sub_df = df.iloc[10:20,:]  選取DataFrame的10-20行,所有列數據

      sub_df = df.iloc[10:20,0:2]

      說明:iloc函數是位置索引,與索引的名字無關。

   2、loc

      sub_df = df.loc[10:20,:'movie_name']

      說明:loc是標簽索引,10,20,'movie_name'  都是索引名字,與位置無關。

1、Series.reindex(index=['x1','x2','x3'],fill_value=10)

      將df重新索引,並且將NaN空值用10進行填充

2、Series.reindex(index=range(15),method='ffill')

     前項填充,後面的值用前面的值進行填充

     通過reindex想到,如果想新增一個空列或者空行,可以用reindex方法,同樣地,想減少某些行或者某些列,也可以用reindex方法。

      繼reindex之後刪除行列的函數操作

      Series.drop('A')   #刪除'A'所對應的值

      DataFrame.drop(label,axis) 

      label可以是行名也可以是列名,label是行的話axis是0,label是列的話axis是1。

     ** 刪除行還可以用 del df['A']

nan是numpy的一種數據類型,np.nan,float類型

任何數據與nan的運算結果都是nan

1、nan in Series

      Series.isnull()  -->返回value為True或者False的Series

      Series.notnull()  -->返回value為True或者False的Series

      Series.dropna()  -->返回刪除nan值後的Series

      Series.fillna(method='ffill')  -->前項插值,按照前面的值填充後面的空值

2、nan in DataFrame

      df.isnull()  -->返回value為True或者False的DataFrame

      df.notnull()  -->返回value為True或者False的DataFrame

      df.dropna(axis=0/1,how='any/all',thresh=None)

      說明:axis表示刪除行為nan或者列為nan;

                any表示只要有一個為空,all表示行中的每個元素或者列中的每個元素為空;

                thresh是閾值的意思,表示某行或者某列nan的個數達到閾值的個數時才刪除該行或該列。

      df.fillna(value=1)  --->所有的空值都填充為1

      df.fillna(value={0:0,1:1,2:2}) --->將0列的空值填為0,1列的空值填為1,2列的空值填為2,默認為填充列

      注意:fillna和dropna的特點,生成新的DataFrame,原來的DataFrame不變。

1、多重索引介紹

     Series = pd.Series(np.random.randn(6),index=[['1','1','1','2','2','2'],['a','b','c','a','b','c']])

    '1','2'為一級索引,'a','b','c'為二級索引

    df 可以看做是索引的'1','2'的Series

    Series['1']  -->Series

    Series['1']['a']  -->value

    Series[:,'a'] -->選擇'1'和'2'中的'a'對應的值

2、多重索引格式轉為二維DataFrame

    df = Series.unstack() -->轉為二維DataFrame

3、多重索引在DataFrame中的操作

1、 map函數與apply函數、applymap函數的區別:

      1)map函數對Series中的每個元素作用;

      2)applymap函數對DataFrame中的每個元素作用;

      3)apply函數對對DataFrame和Series的一列做整體運算。

2、Series.replace(to_replace=[2,3,4],values=[20,30,40])  替換Series中多個值

    Series.replace({1:10,2:20})  將索引為1的值替換為10,將索引為2的值替換為20

    df.sum()  -->默認按照列進行求和,nan的值被忽略

    df.min()  -->默認按照列求最小值

    df.max()  -->默認按照列求最大值

    df.mean()  -->默認按照列求平均值

    df.describe()  -->默認按照列進行描述

    df.sum(axis=1)  -->按行求和,nan的值被忽略

    #axis=0表示對橫軸進行操作,但是運算中表現為縱軸操作

    #axis=1表示對縱軸進行操作,但是運算中表現為橫軸操作

 bins = [0,59,70,80,100],bins是分割范圍

 score_cat = pd.cut(Series,bins)  --->得到catgory類型的數據

 DataFrame的分箱技術很棒啊!

 pd['catgory'] = pd.cut(df['a'],bins=[0,59,70,80,100],labels=['low','ok','good','great'])

 -->新增一列,將a列的值按照labels進行分類標記,good!!!

 #生成長度為3的隨機字元串  pd.util.testing.rands(3)

1、按照一列分組

      g = df.groupby('city')

      g是分組類型數據,列印不出來,所以看不到,但是有屬性和方法可以間接的了解

     1) g.groups  -->得到分的幾個組,和每個組包含的索引

     2)g.get_group('BJ')  -->得到'BJ'所對應的組

     3)groupby = split +apply +combine

           g.mean()  -->求每組的平均值

           g.max()   -->求每組的最大值

           g.min()   -->求每組的最小值

           g.count()

           g.describe()

      4)g是一個可迭代對象,可以用list函數將其轉化為list

          list(g) -- > [('組名1',DataFrame1),('組名2',DataFrame2),(),()]

          dict(list(g))  -->將其轉化為字典

      同時可以通過for循環進行遍歷操作:for item,desc in g:print(item,desc)

      #怪不得分組後不是DataFrame,因為元組的第一個元素是'分組名'。

2、按照多列分組

      g_new = df.groupby(['city','wind'])

      得到生成器((('分組1','分組2'),DataFrame),(),()...)

      g_new.get_group(('分組1','分組2'))

      for (name_1,name_2),group in g_new:

              print((name_1,name_2),group)

 g.mean()  -->求每組的平均值

 與g.agg('mean')方法一樣

pd.pivot_table(df,index=['',''],aggfuc='sum',values=['',''])

index是分組的組名,values是透視表呈現結果的列,columns是values下的分解

#感覺透視表呈現的結果就是groupby+agg後的結果

#分析者需要對數據結構有一定的了解

df.sort_values(by='',ascending=True/False)[:10]  df可以索引

df.value_counts()  -->按值計數

df.['a'] = df['b'].apply(lambda x:x>0)  -->DataFrame中的True/False

通過g.size()可以看到被groupby之後的數據,得到的是一個Series

1、Series的排序:

    1)對值進行排序

    Series.sort_values()  --->直接對Series的值進行排序

    2)通過索引進行排序

    Series.sort_index() 

    #默認都是升序排列

2、DataFrame的排序

     df.sort_values(by='')  -->按照某列的順序進行排序

    df['a'].sort_values()  -->返回對a列數據的排序結果,只返回a列

1、df.index = Series(['a','b','c'])  直接對index賦予新值

2、df.index = df.index.map(str.upper)

     map函數中只傳入新的函數名即可

3、df.rename(index=str.upper,columns=str.lower)

      或者傳遞字典,進行一一轉換

    pd.merge(df1,df2,on=None,how='left/right/inner/outer')

    pd.merge(df1,df2)  -->沒有on參數默認先找相同的columns,然後在columns下找相同的values

    pd.merge(df1,df2,on='columns')  -->on參數是指按照指定列進行merge

    left:表示以左邊的數據表為基準,進行填充右面的數據

    right:表示以右邊的數據表為基準,填充左邊的數據

    outer:以on的指定列的所有值為基準,填充兩邊的數據

    inner:默認inner,相同on指定的columns下的相同values對應的左右兩邊的數據

1、concat拼接

    pd.concat([Series1,Series2])

    pd.concat([df1,df2])  -- >上下疊加,將沒有的列進行填充

2、combine組合

    Series1.combine_first(Series2)  -->用Series2的值去填充Series1中為空的值

    df1.combine_first(df2)  --->用df2將df1中的空值填充

    df['A'] = df['A'].apply(str.upper)  --->apply函數中也只輸入函數名

    len(df)  -->求df的長度

    len(df['a'].unique())  -->查看a列中不重復數據的多少

    Series.plicated()  -->返回一列True/False的Series

    Series.drop_plicates()  -->刪除重復值

    df.drop_plicates('a',keep='first/last')

    df.drop_plicates()  -->刪除完全重復的行

    參數:'a'表示以a列為基準,刪除重復值

              first表示保留第一個,last表示保留最後一個

    data_list = pd.date_range(start,end,period='D',freq)

    period='D',以天為單位

    freq = 'W' 以周為單位

    freq = 'W-Mon'以每周一位單位

    freq = '5H'  以5h為單位

    以data_range作為索引提取數據比較簡單

    df[datetime(2017,9,1)]

    df['2017-09-01']

    df['20170901']

    df['201709']

    對時間序列數據進行分組聚合操作:

    s1.resample('M').mean()  -->以月為單位進行采樣,然後求每組的平均值

    s1.resample('H').ffill()  -->前項填充

    s1.resample('H').bfill()  -->後項填充

補充:1)jupyter中可以執行linux命令,太棒了!

                !ls

                !more xxx.csv

                !pwd  等等

           2)jupyter 查看函數幫助的快捷鍵:摁住shift + tab  棒!!!

⑥ python數據分析使用的數據

1、對數據進行排序df.sort_values()
#讀取數據
titanic_survival=pd.read_csv(r"C:Userspythonwandata_minepython_pandas itanic_train.csv")
#用sort_values()函數對指定列排序,默認升序排序,inplace=True表示在原來的df上排序titanic_survival.sort_values(("Age"),inplace=Tru
2、缺失值判斷及統計pandas.isnull()、pandas.isnull
空值統計方法一:df.isnull().sum():
#當不指定具體列時,統計整個df的缺失值個數
titanic_survival['Age'].isnull().sum()
通過len()函數統計缺失值
3、缺失值處理
處理缺失值可以分為兩類:刪除缺失值和缺失值插補。而缺失值插補又分為以下幾種:
均值/中位數/眾數插補
使用固定值(將缺失值的屬性用一個常量代替)
最近鄰插補(在記錄中找到與缺失值樣本最接近的樣本的該屬性插補)
回歸方法(對帶有缺失值的變數,根據已有數據和與其有關的其他變數建立擬合模型來預測缺失值)
插值法(利用已知點建立合適的插值函數f(x),未知值由對應點xi求出來近似代替)
下面,我們主要討論刪除缺失值,學習一些pandas缺失值刪除的操作。
1)df.dropna(),舍棄含有任意缺失值的行
#等價於titanic_survival.dropna(axis=0) axis=0表示刪除行,axis=1表示刪除列
dropall=titanic_survival.dropna()
刪除含任意空值的行
2)df.dropna()函數刪除某個列中含有空值的行
現在這個數據中age、cabin、embarked都有缺失值,如果我們直接使用df.dropna()會刪除掉這三列中都有空值的所有行,但是我們希望只刪除age列中有空值的數據,那該如何處理呢?
直接使用df.dropna(subset=['column_list'])
drop_age_null=titanic_survival.dropna(subset=["Age"])
刪除指定列中含有缺失值的行
pandas自定義函數

⑦ Python其實很簡單 第二十一章 DataFrame數據處理

將Excel中的的數據讀入數據框架DataFrame後,可以非常方便的進行各種數據處理。

21.1 列間求和

求總分(總分=語文+數學+英語)

對於上一章所提到的學生成績表,僅用一個語句即可完成總分計算,並填充。

df['總分']=df['語文']+df['數學']+df['英語']

完整代碼如下:

from pandas import read_excel

file='d:/student.xlsx' #見第18章表18-1

df=read_excel(file,sheet_name=0,converters={'學號':str})

df['總分']=df['語文']+df['數學']+df['英語']

print(df.head()) #df.head()的作用是僅顯示5行記錄。

運行結果如下:

序號 學號 姓名 年級 班級 語文 數學 英語 總分 名次

0 1 070101 王博宇 NaN NaN 84 71 93 248 NaN

1 2 070102 陳冠濤 NaN NaN 89 89 89 267 NaN

2 3 070103 李文博 NaN NaN 89 72 76 237 NaN

3 4 070204 姜海燕 NaN NaN 89 89 89 267 NaN

4 5 070205 林若溪 NaN NaN 91 95 83 269 NaN

21.2替換

既可以將對滿足條件的行和列的數據替換,也可以對整個集合的數據按照條件進行替換。

df['總分'].replace(310,'x',inplace=True)

將總分列的數值「310」替換為「x」。inplace=True表示改變原數據。

df.replace(76,0,inplace=True)

將整個DataFrame中的數值「76」替換為「0」。

df.replace([98,76,99],0,inplace=True)

將整個DataFrame中的數值「98,76,99」一次替換為「0」。

21.2排序

既可以將某一列作為關鍵欄位排序,也可以將幾個列分別作為主、次關鍵欄位進行排序。排序既可以按升序排序,也可以按降序排序。

函數sort_values()的語法格式如下:

df.sort_values(by=[「col1」,」col2」,......,」coln」],ascending=False)

其中,coln表示列名,也可以是列名的列表;ascending表示排序方式,值為True表示升序,可以省缺,值為False表示降序。

如:

df=df.sort_values(by=['總分'],ascending=False)

表示按照「總分」從高到低排序。

df=df.sort_values(by=['總分','語文'],ascending=False)

表示按照「總分」從高到低排序,若「總分」相同,再按照「語文」成績從高到低排序。

21.3 欄位截取

函數slice()可以從某列中截取字元串。格式如下:

slice(start,stop)

其中,start表示開始位置;stop表示結束位置

例:

df['年級']=df['學號'].str.slice(0,2)

通過此語句可以截取學號欄位的第1、2個字元,並賦值給年級欄位。

21.4 記錄抽取

可以抽取滿足條件的記錄。

例:抽取總分>300的記錄。

df[df.總分>300]

抽取總分在300到310之間(包括300和310)的記錄。

df[df.總分.between(306,310)]

抽取學號中包含「0803」的記錄。這樣可以非常方便的抽取某個班的信息。

df[df.學號.str.contains(񟚓',na=False)]

此處的na=False,含義是如遇到NaN這樣的數據,直接做不匹配處理。

21.5修改記錄

1、整列替換

我們在前面已經給整列填充過數據,填充時原來的數據就被覆蓋了。

即如下語句:

df['總分']=df['語文']+df['數學']+df['英語']

2、個別修改

如將值『99』替換為值『100』,可用如下語句:

df.replace(ྟ',颼')

將指定列的值替,如將語文列和英語列的值『99』替換為值『100』,可用如下語句:

df.replace({'語文':99,'英語':99},100)

可用如下程序去驗證:

from pandas import read_excel

file='d:/student.xlsx'

df=read_excel(file,sheet_name=0,converters={'學號':str})

print(df[(df.語文==99) |(df.英語==99)])

df=df.replace({'語文':99,'英語':99},100)

print(df[(df.語文==99) |(df.英語==99)])

運行結果為:

序號 學號 姓名 年級 班級 語文 數學 英語 總分 名次

28 29 090802 丁能通 09 NaN 119 120 99 338 NaN

29 30 090203 沈丹妮 09 NaN 109 108 99 316 NaN

Empty DataFrame

Columns: [序號, 學號, 姓名, 年級, 班級, 語文, 數學, 英語, 總分, 名次]

Index: []

可以看出,第一個print()語句輸出的結果中滿足條件「語文或英語為99分」的有兩條記錄,替換語句執行以後,df中再沒有滿足條件「語文或英語為99分」的記錄了。

21.6記錄合並

函數concat()的格式如下:

concat([dataFrame1,dataFrame2,......],ignore_index=True)

其中,dataFrame1等表示要合並的DataFrame數據集合;ignore_index=True表示合並之後的重新建立索引。其返回值也是DataFrame類型。

concat()函數和append()函數的功能非常相似。

例:

import pandas #導入pandas模塊

from pandas import read_excel #導入read_execel

file='d:/student.xlsx' #變數file表示文件路徑,注意'/'的用法 數據見第18章表18-1

df=read_excel(file,sheet_name=0,converters={'學號':str})

# 將Excel文件導入到DataFrame變數中

df=df[:5] #截取df的前5個記錄

print(df) #輸出df

df1=df[:3] #截取df的前3個記錄存入df1中

df2=df[3:5] #截取df的最後2個記錄存入df2中

df3=pandas.concat([df2,df1]) #將df2與df1合並存入df3中

print(df3) #輸出df3

運行結果如下:

序號 學號 姓名 年級 班級 語文 數學 英語 總分 名次

0 1 070101 王博宇 NaN NaN 84 71 93 NaN NaN

1 2 070102 陳冠濤 NaN NaN 89 89 89 NaN NaN

2 3 070103 李文博 NaN NaN 89 72 76 NaN NaN

3 4 070204 姜海燕 NaN NaN 89 89 89 NaN NaN

4 5 070205 林若溪 NaN NaN 91 95 83 NaN NaN

序號 學號 姓名 年級 班級 語文 數學 英語 總分 名次

3 4 070204 姜海燕 NaN NaN 89 89 89 NaN NaN

4 5 070205 林若溪 NaN NaN 91 95 83 NaN NaN

0 1 070101 王博宇 NaN NaN 84 71 93 NaN NaN

1 2 070102 陳冠濤 NaN NaN 89 89 89 NaN NaN

2 3 070103 李文博 NaN NaN 89 72 76 NaN NaN

由於合並時是將df1合並到df2中,可以看出,索引仍然保持原來的狀態。

21.7統計次數

可以用如下方法統計出某個值在某行或者某個范圍出現的次數。

from pandas import read_excel

file='d:/student.xlsx'

df=read_excel(file,sheet_name=0,converters={'學號':str})

df=df[:5]

print(df)

print(df['語文'].value_counts())

輸出結果如下:

序號 學號 姓名 年級 班級 語文 數學 英語 總分 名次

0 1 070101 王博宇 NaN NaN 84 71 93 NaN NaN

1 2 070102 陳冠濤 NaN NaN 89 89 89 NaN NaN

2 3 070103 李文博 NaN NaN 89 72 76 NaN NaN

3 4 070204 姜海燕 NaN NaN 89 89 89 NaN NaN

4 5 070205 林若溪 NaN NaN 91 95 83 NaN NaN

89 3

84 1

91 1

Name: 語文, dtype: int64

可以看出,通過value_counts()函數可以統計出列中各值出現的次數。

value_counts()函數的參數還有 :

ascending,當ascending=True時升序排列,當ascending=False時升序排列(此時該參數可省缺);

normalize,當normalize=True時,顯示的不再是各值出現的次數,而是佔比。

將上例中的語句print(df['語文'].value_counts())改為:

print(df['語文'].value_counts(ascending=True,normalize=True))

則輸出結果變成了:

91 0.2

84 0.2

89 0.6

Name: 語文, dtype: float64

21.8按值查找

print(df['語文'].isin([84,91]))

它的作用是查找『語文』列中值和isin所指的列表中元素一致的記錄,如果找到結果為True,否則為False。

輸出結果:

0 True

1 False

2 False

3 False

4 True

Name: 語文, dtype: bool

21.9數據分區

根據某個分區標准,將數據按照所屬區域進行劃分,並用相應的標簽表示,可以用cut()方法來實現。

語法格式如下:

cut(series, bins, right=True, labels=NULL)

其中:

series表示需要分組的數據;

bins表示分組的依據,是一個列表,其元素為劃分分區的邊界值,如[0,72,96,120],就是劃分3個分區,即0~72、72~96、96~120,默認的是「左包右不包」;

right表示分組時右邊是否閉合;

labels表示分組的自定義標簽,也可以不重新定義。

下面對上述學生成績表中的語文成績進行分組,並增加一個新的列「語文等級」。

import pandas as pd

from pandas import read_excel #導入read_execel

file='d:/student.xlsx'

df=read_excel(file,sheet_name=0,converters={'學號':str})

df['年級']=df['學號'].str.slice(0,2)

df['班級']=df['學號'].str.slice(0,4)

df.總分=df.語文+df.數學+df.英語

bins=[0,72,96,max(df.語文)+1] #

lab=['不及格','及格','優秀']

grade=pd.cut(df.語文,bins,right=False,labels=lab)

df['語文等級']=grade

print(df.head())

print("語文成績分等級統計結果:")

print(df['語文等級'].value_counts())


運行結果如下:

序號 學號 姓名 年級 班級 語文 數學 英語 總分 語文等級

0 1 070101 王博宇 07 0701 84 71 93 248 及格

1 2 070102 陳冠濤 07 0701 89 89 89 267 及格

2 3 070103 李文博 07 0701 89 72 76 237 及格

3 4 070204 姜海燕 07 0702 89 89 89 267 及格

4 5 070205 林若溪 07 0702 91 95 83 269 及格

語文成績分等級統計結果:

及格 17

優秀 10

不及格 4

Name: 語文等級, dtype: int64

閱讀全文

與pythondf排序相關的資料

熱點內容
銀行人員如何解壓 瀏覽:827
newfile命令快捷鍵 瀏覽:567
阿里雲物理伺服器 瀏覽:953
靈狐視頻app哪個好 瀏覽:257
大廠退役程序員自述 瀏覽:252
linux命令watch 瀏覽:889
加密幣哪些平台不撤出中國 瀏覽:553
max加線命令 瀏覽:424
app胖瘦模式哪個好用 瀏覽:724
可以下載源碼的軟體 瀏覽:487
程序員寫一天代碼累嗎 瀏覽:628
ie文件夾禁止訪問 瀏覽:545
百川互聯網程序員 瀏覽:785
linuxpython解釋器 瀏覽:669
興安得力軟體加密狗 瀏覽:494
智能網路攝像頭加密 瀏覽:575
軟體畢業程序員培訓 瀏覽:654
安卓陀螺儀低怎麼辦 瀏覽:248
一級建造師復習題集pdf 瀏覽:905
法理學pdf海默 瀏覽:394