溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Pandas中比較好用的幾個方法分別是什么

發(fā)布時間:2021-11-11 16:33:19 來源:億速云 閱讀:134 作者:柒染 欄目:大數(shù)據(jù)

今天就跟大家聊聊有關(guān)Pandas中比較好用的幾個方法分別是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

話說我現(xiàn)在好久不做深度學習的東西了,做了一段時間是的NLP,以為可以去嘗試各種高大上的算法,然而現(xiàn)在還并沒有,反而覺得更像是做數(shù)據(jù)挖掘的。。平時遇到的比較多的問題,大多數(shù)都是數(shù)據(jù)清洗的工作,這時候工具就顯得很重要,有一個好的工具能起到事半功倍的效果,比如突然有個idea,然后自己開始呼哧呼哧的造輪子,最后才發(fā)現(xiàn),哦,原來都有現(xiàn)成的方法,本來一行代碼就可以搞定的問題,到最后寫了幾十行。 正所謂,“欲閃其事,必先利其器”啊。 好了,廢話不多說,下面介紹幾個神奇的方法。

  1.   數(shù)據(jù)篩選

        先把數(shù)據(jù)導入進來,數(shù)據(jù)一共有4列,分別是日期,星期,品牌和數(shù)量,一共有14行數(shù)據(jù)。


import pandas as pd

data = pd.read_table("test.txt")
print(data.head(2))
print(data.shape)
"""
  日期  星期  品牌  數(shù)量
   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}
"""

好,如果我現(xiàn)在想查看品牌1的數(shù)據(jù),怎么做呢。可以這樣

brand_1 = data[data['品牌'].isin([1])]
print(brand_1)
"""
  日期  星期  品牌    數(shù)量
0   1   3   1    20
2   2   4   1    16
4   3   5   1  1411
9   4   6   1  1176
"""

看一下,這里用了isin()方法,這樣就得到了品牌1的全部數(shù)據(jù),可能也有人說,還有一種做法,就是用Groupby,好,Groupby是pandas中用來做分組統(tǒng)計的方法。不知道?沒關(guān)系,下面介紹

這里還有要2件事情,可不可以查看多個品牌的數(shù)據(jù)?可以,這樣做就行了

brand_n = data[data['品牌'].isin([1, 2])]
print(brand_n)
"""
   日期  星期  品牌    數(shù)量
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以外的數(shù)據(jù),怎么做? 用pandas 很簡單。這樣就可以


brand_ex_1 = data[~data['品牌'].isin([1])]
print(brand_ex_1)
"""
   日期  星期  品牌    數(shù)量
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 . 數(shù)據(jù)分組

好,然后說一下,groupby,groupby就是group data by xx。按照xx把數(shù)據(jù)分為幾個組。先看個栗子,首先把數(shù)據(jù)按日期分組。


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')
"""

分組之后的數(shù)據(jù)還是一個DataFrame對象,所以可以調(diào)用index方法。

如果要對分組后的數(shù)據(jù)做統(tǒng)計分析,可以這樣來做

import pandas as pd

data = pd.read_table("test.txt")
data_grouped = data.groupby(by='日期')['數(shù)量'].mean()

print(data_grouped)

這樣就可以查看每一天數(shù)量的平均值了。

3. appy方法

如果我想給數(shù)量這一列,每個值都乘以2,可以怎么做呢? 方法很多,這里介紹一下,如何用apply來做,

import pandas as pd

data = pd.read_table("test.txt")


def double_df(x):
   return 2 * x


data_double = data['數(shù)量'].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: 數(shù)量, 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['數(shù)量'] = data['數(shù)量'].apply(double_df)
print(data_copy)
"""
   日期  星期  品牌    數(shù)量
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, 然后給復制的數(shù)據(jù)中的“數(shù)量”這一列用data中數(shù)量的列apply函數(shù),這樣就不會有數(shù)據(jù)損失了。

好,這是apply的基本應用,如果我們想對兩列數(shù)據(jù)使用apply函數(shù),應該怎么做。開始我也不會,那天突然有這樣的想法,因為我的數(shù)據(jù)是在兩列都有,然后我想統(tǒng)計兩列的性質(zhì),無奈不知道怎么用,然后在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

"""

同樣,你要是想的到原始的全部數(shù)據(jù),最好復制一份,不然可能會報錯,有興趣可以去試試。

4. 刪除Pandas中的NaN和空格

對于缺失數(shù)據(jù)的處理,無非兩種方法,一種是直接刪掉不要了,一種是添加進去一些別的數(shù)據(jù),那Pandas怎么刪除缺失值?本來Pandas提供了dropna方法,直接一個方法就搞定了,但是有時候缺失值不是Nan,而是空格或者別的什么,死活刪不掉,我就遇到過,然后折騰啊折騰,一直報ValueError的錯誤,但是我明明用了dropna了,說明數(shù)據(jù)還是沒有清洗干凈。好,下面這個方法,是我搜集到的網(wǎng)上現(xiàn)有的三種刪除缺失值的方法,可以直接用。


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)

看完上述內(nèi)容,你們對Pandas中比較好用的幾個方法分別是什么有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI