
文章目錄
- pandas按列選擇資料
- 中括號取值
- 按照資料型別選擇列
- filter方法選擇列
- pandas按行選擇資料
- 行或列智能函式應用程式
- 大資料排序
- sort_index方法
- sort_values方法
- 分組與聚合計算
- 分組
- 合并兩列資料
去重在上一篇講過了,這里就不再提及,
pandas按列選擇資料
中括號取值
就先來個最直觀的方式,直接中括號取值,
# 創建含有空格的資料
dict1 = {"name": ["小紅", "小明", "小張"], "age": [16, 17, 18], "city": ["北京 ", "杭州", " 上海 "]}
df2 = pd.DataFrame(dict1, columns=["name", "age", "city"])
# 清除空格
df2["city"] = df2["city"].map(str.strip)
print(df2['name'])
0 小紅
1 小明
2 小張
Name: name, dtype: object
當然,你要是不知道列名稱那怎么行?連列名都不知道還取個球,,,
print(df2.columns)
醬紫
Index(['name', 'age', 'city'], dtype='object')
一般都要選擇多列資料的,對吧,對吧!
行,我們來選取一下多列資料:
print(df2[['name','age']]) # 看清楚,傳進去的是一個串列,而不是兩個字串咯,
name age
0 小紅 16
1 小明 17
2 小張 18
按照資料型別選擇列
先來獲取一下當前DataFrame的資料列資料型別情況吧:
name object
age int64
city object
dtype: object
獲取一下object物件唄:
print(df2.select_dtypes(include='object'))
name city
0 小紅 北京
1 小明 杭州
2 小張 上海
那,如果說我要選擇‘object’物件以外的物件呢?
print(df2.select_dtypes(exclude='object'))
age
0 16
1 17
2 18
filter方法選擇列
它有三個常用引數,我們一個一個看,不過要注意:這三個引數并不能同時出現,
使用items選擇多個列:
df2 = df2.filter(items=['name','age'])
print(df2)
就跟上面那個直接取值的是一樣的,
name age
0 小紅 16
1 小明 17
2 小張 18
使用like選擇匹配的列:要求列名中含有,,,
df2 = df2.filter(like='a')
print(df2)
name age
0 小紅 16
1 小明 17
2 小張 18
使用正則運算式取列:
df2 = df2.filter(regex='[a-z]')
print(df2)
name age city
0 小紅 16 北京
1 小明 17 杭州
2 小張 18 上海
pandas按行選擇資料
先看個loc方法啊:
df2 = df2.loc[0:2]
print(df2)
name age city
0 小紅 16 北京
1 小明 17 杭州
2 小張 18 上海
你悟到了?
再來:
df2 = df2.loc[0:2,['name','age']]
name age
0 小紅 16
1 小明 17
2 小張 18
我就把結果放這兒,我就默默不說話,
df2 = df2.loc[(df2['age']>16) & (df2['age']<18)]
df2 = df2.loc[(df2['age']>16) | (df2['age']<18)]
這里我連結果都不想放了,發揮你們的想象力,
差不多了吧,我想想還有啥、、
lambda運算式,對、
df2 = df2.loc[lambda x:x.city == '北京']
吶,像這樣,
行或列智能函式應用程式
可以使用 apply() 方法沿著DataFrame或Panel的坐標軸應用任意函式,該方法與描述性統計方法一樣,采用可選的軸引數,默認情況下,該操作執行列,每列作為一個陣列,
pandas 的 apply() 函式可以作用于 Series 或者整個 DataFrame,功能也是自動遍歷整個 Series 或者 DataFrame, 對每一個元素運行指定的函式,
舉一個例子,現在有這樣一組資料,學生的考試成績:
Name Nationality Score
張 漢 400
李 回 450
王 漢 460
如果民族不是漢族,則總分在考試分數上再加 5 分,現在需要用 pandas 來做這種計算,我們在 Dataframe 中增加一列,
import pandas as pd
df = pd.read_csv("studuent-score.csv")
df['ExtraScore'] = df['Nationality'].apply(lambda x : 5 if x != '漢' else 0)
df['TotalScore'] = df['Score'] + df['ExtraScore']
Name Nationality Score ExtraScore TotalScore
0 張 漢 400 0 400
1 李 回 450 5 455
2 王 漢 460 0 460
DataFrame.apply() 函式則會遍歷每一個元素,對元素運行指定的 function,
matrix = [
[1,2,3],
[4,5,6],
[7,8,9]
]
df = pd.DataFrame(matrix, columns=list('xyz'), index=list('abc'))
df.apply(np.square)
對 df 執行 square() 函式后,所有的元素都執行平方運算:
x y z
a 1 4 9
b 16 25 36
c 49 64 81
如果只想 apply() 作用于指定的行和列,可以用行或者列的 name 屬性進行限定,比如下面的示例將 x 列進行平方運算:
df.apply(lambda x : np.square(x) if x.name=='x' else x)
x y z
a 1 2 3
b 16 5 6
c 49 8 9
大資料排序
sort_index方法
這個函式呢,你看到它的引數有很多,但是常用引數只有一個:ascending:True升序,False降序,
dict1 = {"name": ["小紅", "小明", "小張"], "age": [16, 18, 17], "city": ["北京 ", "杭州", " 上海 "]}
df2 = pd.DataFrame(dict1, columns=["name", "age", "city"])
# 清除空格
df2["city"] = df2["city"].map(str.strip)
df2 = df2.set_index('age')
df2 = df2.sort_index(ascending=True)
print(df2)
這個是正常可以用的啊,根據索引列進行升序排序,
name city
age
16 小紅 北京
17 小張 上海
18 小明 杭州
如果我們的索引列中有重復值,會怎么樣?試試看唄:
dict1 = {"name": ["小明", "小張","小紅"], "age": [17, 18, 17], "city": ["北京 ", "杭州", " 上海 "]}
df2 = pd.DataFrame(dict1, columns=["name", "age", "city"])
# 清除空格
df2["city"] = df2["city"].map(str.strip)
df2 = df2.set_index('age')
df2 = df2.sort_index(ascending=True)
print(df2)
看一下結果啊:
name city
age
17 小明 北京
17 小紅 上海
18 小張 杭州
可以看出來,當索引列有重復值的時候,就按照在原資料中的順序進行排放,
那,如果索引列不是阿拉伯數字,而是字串呢?
啊,不知道各位有沒有聽說過ASCII碼啊,應該都聽過吧,
dict1 = {"name": ["ming","hong","zhang"], "age": [17, 18, 17], "city": ["北京 ", "杭州", " 上海 "]}
df2 = pd.DataFrame(dict1, columns=["name", "age", "city"])
# 清除空格
df2["city"] = df2["city"].map(str.strip)
df2 = df2.set_index('name')
df2 = df2.sort_index(ascending=True)
print(df2)
age city
name
hong 18 杭州
ming 17 北京
zhang 17 上海
你要問為什么把中文名改成英文名啊,那我哪知道中文是怎么排序的,,,
別問,問就是不知道,
sort_values方法
這個函式就比較,高可拓展,
常用引數我們看看:
by:str 或 list,按照列名排序
ascending:都懂、
inplace:替換DataFrame的資料
kind:排序演算法,快排、歸并、堆排,預設是快排,{'quicksort','mergesort','heapsort'}
按照年齡進行逆向排序
# 創建含有空格的資料
dict1 = {"name": ["ming","hong","zhang"], "age": [17, 18, 17], "city": ["北京 ", "杭州", " 上海 "]}
df2 = pd.DataFrame(dict1, columns=["name", "age", "city"])
# 清除空格
df2["city"] = df2["city"].map(str.strip)
df2.sort_values('age',ascending=False,inplace = True)
print(df2)
age city
name
hong 18 杭州
ming 17 北京
zhang 17 上海
按照年齡和名字進行逆向排序呢?以年齡為主導,姓名為輔助:
df2.sort_values(['age','name'],ascending=False,,inplace = True)
age city
name
hong 18 杭州
zhang 17 上海
ming 17 北京
分組與聚合計算
分組
然后讓我們先把資料讀出來:
df1 = pd.read_csv('flights.csv')
df2 = pd.read_csv('airlines.csv') #早晚要讀,那就一并讀了吧
接下來,選取航班有延誤的:
df1.loc[df1.ARR_DELAY>=0]
再通過航空公司進行分組:
df1.loc[df1.ARR_DELAY>=0].groupby('AIRLINE')
對每個航空公司的航班延誤次數進行統計:
df1.loc[df1.ARR_DELAY>=0].groupby('AIRLINE').AIRLINE.count()
之后再對統計出的資料進行一次排序,并將最終結果賦值給一個變數:
df_delat = df1.loc[df1.ARR_DELAY>=0].groupby('AIRLINE').AIRLINE.count().sort_values(ascending=False)
AIRLINE
WN 3694
DL 3468
AA 3418
UA 3176
OO 2863
EV 2472
MQ 1367
NK 820
F9 643
US 638
VX 423
AS 262
B6 250
HA 57
Name: AIRLINE, dtype: int64
最終呈現出結果如上,
合并兩列資料
這里可真的是,卡了我十分鐘,也不知道是我讀書不認真還是怎么肥四,,,
前面不是讀了個航空公司資訊嘛,我們剛剛不也得到了延誤航班的基礎資料嘛,但是那些航空公司代碼,你看得懂?
反正我是看不懂,這時候就需要將兩組資料進行一個合并:
剛開始我是寫這樣的:
import pandas as pd
import numpy as np
df1 = pd.read_csv('flights.csv')
df_delay = df1.loc[df1.ARR_DELAY>=0].groupby('AIRLINE').AIRLINE.count()
print(df_delay)
df2 = pd.read_csv('airlines.csv')
df2.set_index('IATA_CODE')
df2['delayed'] = df_delay
print(df2)
結果發現插入的列全是NaN,
于是我就想啊,是不是不能這樣簡單粗暴?于是我就換了一套方法:index,
就把賦值那一行代碼改成這樣了:
df2.insert(len(df2.columns),'delayed',df_delay)
好,運行,依舊不得行,
于是我怒了,我打開百度:
跟我說,是因為索引對不上,于是我把建立索引那一行去掉了,結果依舊是不行的,
直到后來,我看到了兩個土辦法:
import pandas as pd
import numpy as np
df1 = pd.read_csv('flights.csv')
df_delay = df1.loc[df1.ARR_DELAY>=0].groupby('AIRLINE').AIRLINE.count()
print(df_delay)
df2 = pd.read_csv('airlines.csv')
#df2.set_index('IATA_CODE')
df2['delayed'] = list(df_delay) #解決方案一
df2['delayed'] = df_delay.values #解決方案二
#df2.insert(len(df2.columns),'delayed',df_delay)
print(df2)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/274069.html
標籤:python
上一篇:Java_例外處理_總結
下一篇:自然語言處理-斗羅大陸詞切分
