您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關Pandas中比較好用的幾個方法分別是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
話說我現在好久不做深度學習的東西了,做了一段時間是的NLP,以為可以去嘗試各種高大上的算法,然而現在還并沒有,反而覺得更像是做數據挖掘的。。平時遇到的比較多的問題,大多數都是數據清洗的工作,這時候工具就顯得很重要,有一個好的工具能起到事半功倍的效果,比如突然有個idea,然后自己開始呼哧呼哧的造輪子,最后才發現,哦,原來都有現成的方法,本來一行代碼就可以搞定的問題,到最后寫了幾十行。 正所謂,“欲閃其事,必先利其器”啊。 好了,廢話不多說,下面介紹幾個神奇的方法。
數據篩選
先把數據導入進來,數據一共有4列,分別是日期,星期,品牌和數量,一共有14行數據。
import pandas as pd
data = pd.read_table("test.txt")
print(data.head(2))
print(data.shape)
"""
日期 星期 品牌 數量
0 1 3 1 20
1 1 3 5 48
(14, 4)
"""
然后我們可以查看一下品牌列有幾種可能,看到有1,2,3,4,5一共五種品牌。
brand = data['品牌']
print(set(brand.values.tolist()))
"""
{1, 2, 3, 4, 5}
"""
好,如果我現在想查看品牌1的數據,怎么做呢。可以這樣
brand_1 = data[data['品牌'].isin([1])]
print(brand_1)
"""
日期 星期 品牌 數量
0 1 3 1 20
2 2 4 1 16
4 3 5 1 1411
9 4 6 1 1176
"""
看一下,這里用了isin()方法,這樣就得到了品牌1的全部數據,可能也有人說,還有一種做法,就是用Groupby,好,Groupby是pandas中用來做分組統計的方法。不知道?沒關系,下面介紹
這里還有要2件事情,可不可以查看多個品牌的數據?可以,這樣做就行了
brand_n = data[data['品牌'].isin([1, 2])]
print(brand_n)
"""
日期 星期 品牌 數量
0 1 3 1 20
2 2 4 1 16
4 3 5 1 1411
5 3 5 2 811
9 4 6 1 1176
10 4 6 2 824
"""
isin()方法傳入的是一個list就可以,好,如果我想查看除了品牌1以外的數據,怎么做? 用pandas 很簡單。這樣就可以
brand_ex_1 = data[~data['品牌'].isin([1])]
print(brand_ex_1)
"""
日期 星期 品牌 數量
1 1 3 5 48
3 2 4 3 20
5 3 5 2 811
6 3 5 3 1005
7 3 5 4 773
8 3 5 5 1565
10 4 6 2 824
11 4 6 3 802
12 4 6 4 1057
13 4 6 5 1107
"""
2 . 數據分組
好,然后說一下,groupby,groupby就是group data by xx。按照xx把數據分為幾個組。先看個栗子,首先把數據按日期分組。
data_grouped = data.groupby(by='日期')
print("共有 {} 組".format(data_grouped.ngroups))
# 共有 4 組
print(data_grouped.ngroup(ascending=True))
"""
0 3
1 3
2 2
3 2
4 1
5 1
6 1
7 1
8 1
9 0
10 0
11 0
12 0
13 0
"""
查看分組后的索引
indices = data_grouped.indices
day_1 = indices[3]
print(day_1)
"""
[4 5 6 7 8]
"""
還可以這樣
for i, j in data_grouped:
print(i, j.index)
"""
1 Int64Index([0, 1], dtype='int64')
2 Int64Index([2, 3], dtype='int64')
3 Int64Index([4, 5, 6, 7, 8], dtype='int64')
4 Int64Index([9, 10, 11, 12, 13], dtype='int64')
"""
分組之后的數據還是一個DataFrame對象,所以可以調用index方法。
如果要對分組后的數據做統計分析,可以這樣來做
import pandas as pd
data = pd.read_table("test.txt")
data_grouped = data.groupby(by='日期')['數量'].mean()
print(data_grouped)
這樣就可以查看每一天數量的平均值了。
3. appy方法
如果我想給數量這一列,每個值都乘以2,可以怎么做呢? 方法很多,這里介紹一下,如何用apply來做,
import pandas as pd
data = pd.read_table("test.txt")
def double_df(x):
return 2 * x
data_double = data['數量'].apply(double_df)
print(data_double)
"""
0 40
1 96
2 32
3 40
4 2822
5 1622
6 2010
7 1546
8 3130
9 2352
10 1648
11 1604
12 2114
13 2214
Name: 數量, dtype: int64
"""
這樣就可以很簡單的完成這個倍乘的任務,但是輸出貌似不是我們想要的,因為我們還想保留其他列,那應該怎么做呢。
import pandas as pd
data = pd.read_table("test.txt")
def double_df(x):
return 2 * x
data_copy = data.copy()
data_copy['數量'] = data['數量'].apply(double_df)
print(data_copy)
"""
日期 星期 品牌 數量
0 1 3 1 40
1 1 3 5 96
2 2 4 1 32
3 2 4 3 40
4 3 5 1 2822
5 3 5 2 1622
6 3 5 3 2010
7 3 5 4 1546
8 3 5 5 3130
9 4 6 1 2352
10 4 6 2 1648
11 4 6 3 1604
12 4 6 4 2114
13 4 6 5 2214
"""
這里可以先復制一份data, 然后給復制的數據中的“數量”這一列用data中數量的列apply函數,這樣就不會有數據損失了。
好,這是apply的基本應用,如果我們想對兩列數據使用apply函數,應該怎么做。開始我也不會,那天突然有這樣的想法,因為我的數據是在兩列都有,然后我想統計兩列的性質,無奈不知道怎么用,然后在stackflow上找到了答案。這里分享給大家
def double_df(a, b):
return "{:.03f}".format(a / b)
data_apply = data.apply(lambda row:
double_df(row['星期'],
row['品牌']),
axis=1)
print(data_apply)
"""
0 3.000
1 0.600
2 4.000
3 1.333
4 5.000
5 2.500
6 1.667
7 1.250
8 1.000
9 6.000
10 3.000
11 2.000
12 1.500
13 1.200
dtype: object
"""
或者這樣
def double_df(rows):
return "{:.03f}".format(rows['星期'] / rows['品牌'])
data_apply = data.apply(double_df, axis=1)
print(data_apply)
"""
0 3.000
1 0.600
2 4.000
3 1.333
4 5.000
5 2.500
6 1.667
7 1.250
8 1.000
9 6.000
10 3.000
11 2.000
12 1.500
13 1.200
dtype: object
"""
同樣,你要是想的到原始的全部數據,最好復制一份,不然可能會報錯,有興趣可以去試試。
4. 刪除Pandas中的NaN和空格
對于缺失數據的處理,無非兩種方法,一種是直接刪掉不要了,一種是添加進去一些別的數據,那Pandas怎么刪除缺失值?本來Pandas提供了dropna方法,直接一個方法就搞定了,但是有時候缺失值不是Nan,而是空格或者別的什么,死活刪不掉,我就遇到過,然后折騰啊折騰,一直報ValueError的錯誤,但是我明明用了dropna了,說明數據還是沒有清洗干凈。好,下面這個方法,是我搜集到的網上現有的三種刪除缺失值的方法,可以直接用。
def delet_pandas_na(in_df, columns_name, method='one'):
if method == 'one':
out_df = in_df.copy()
out_df[columns_name] = \
in_df[columns_name].apply(
lambda x: np.NaN if len(str(x)) < 1 else x)
out_df_res = out_df[out_df[columns_name].notnull()]
return out_df_res
elif method == 'two':
out_df = (in_df[columns_name].isnull()) | \
(in_df[columns_name].apply(
lambda x: str(x).isspace()))
out_df_res = in_df[~out_df]
return out_df_res
else:
in_df.dropna(inplace=True)
indices_to_keep = ~in_df.isin([np.nan,
np.inf,
-np.inf]).any(1)
return in_df[indices_to_keep].astype(np.float64)
看完上述內容,你們對Pandas中比較好用的幾個方法分別是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。