1. 程式人生 > 其它 >pandas之使用自定義函式

pandas之使用自定義函式

如果想要應用自定義的函式,或者把其他庫中的函式應用到 Pandas 物件中,有以下三種方法:

  • 1)操作整個 DataFrame 的函式:pipe()
  • 2)操作行或者列的函式:apply()
  • 3)操作單一元素的函式:applymap()


如何從上述函式中選擇適合的函式,這取決於函式的操作物件。下面介紹了三種方法的使用。

操作整個資料表

通過給 pipe() 函式傳遞一個自定義函式和適當數量的引數值,從而操作 DataFrme 中的所有元素。下面示例,實現了資料表中的元素值依次加 3。

首先自定義一個函式,計算兩個元素的加和,如下所示:

  1. def adder(ele1,ele2):
  2. return ele1+ele2

然後使用自定義的函式對 DataFrame 進行操作:

  1. df = pd.DataFrame(np.random.randn(4,3,columns=['c1','c2','c3'])
  2. #傳入自定義函式以及要相加的數值3
  3. df.pipe(adder,3)

完整的程式,如下所示:

  1. import pandas as pd
  2. import numpy as np
  3. #自定義函式
  4. def adder(ele1,ele2):
  5. return ele1+ele2
  6. #操作DataFrame
  7. df = pd.DataFrame(np.random.randn(4,3),columns=['c1','c2','c3'])
  8. #相加前
  9. print(df)
  10. #相加後
  11. print(df.pipe(adder,3))

輸出結果:

 c1 c2 c3
0 1.989075 0.932426 -0.523568
1 -1.736317 0.703575 -0.819940
2 0.657279 -0.872929 0.040841
3 0.441424 1.170723 -0.629618
 c1 c2 c3
0 4.989075 3.932426 2.476432
1 1.263683 3.703575 2.180060
2 3.657279 2.127071 3.040841
3 3.441424 4.170723 2.370382

操作行或列

如果要操作 DataFrame 的某一行或者某一列,可以使用 apply() 方法,該方法與描述性統計方法類似,都有可選引數 axis,並且預設按列操作。示例如下:

  1. import pandas as pd
  2. import numpy as np
  3. df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
  4. df.apply(np.mean)
  5. #預設按列操作,計算每一列均值
  6. print(df.apply(np.mean))

輸出結果:

col1    0.277214
col2    0.716651
col3   -0.250487
dtype: float64

傳遞軸參 axis=1, 表示逐行進行操作,示例如下:

  1. import pandas as pd
  2. import numpy as np
  3. df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
  4. print(df)
  5. print (df.apply(np.mean,axis=1))

輸出結果:

 col1 col2 col3
0 0.210370 -0.662840 -0.281454
1 -0.875735 0.531935 -0.283924
2 1.036009 -0.958771 -1.048961
3 -1.266042 -0.257666 0.403416
4 0.496041 -1.071545 1.432817

0 -0.244641
1 -0.209242
2 -0.323908
3 -0.373431
4 0.285771
dtype: float64

求每一列中,最大值與最小值之差。示例如下:

  1. import pandas as pd
  2. import numpy as np
  3. df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
  4. print(df.apply(lambda x: x.max() - x.min()))

輸出結果:

col1    3.538252
col2    2.904771
col3    2.650892
dtype: float64

操作單一元素

DataFrame 資料表結構的 applymap() 和 Series 系列結構的 map() 類似,它們都可以接受一個 Python 函式,並返回相應的值。

示例如下:

  1. import pandas as pd
  2. import numpy as np
  3. df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
  4. #自定義函式lambda函式
  5. print(df['col1'].map(lambda x:x*100))

輸出結果:

0    -18.171706
1      1.582861
2     22.398156
3     32.395690
4   -133.143543
Name: col1, dtype: float64

下面示例使用了 applymap() 函式,如下所示:

  1. import pandas as pd
  2. import numpy as np
  3. #自定義函式
  4. df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
  5. print(df.applymap(lambda x:x*10))
  6. print(df.apply(np.mean))

輸出結果:

        col1       col2       col3
0  -1.055926   7.952690  15.225932
1   9.362457 -12.230732   7.663450
2   2.910049  -2.782934   2.073905
3 -12.008132  -1.444989   5.988144
4   2.877850   6.563894   8.192513
#求均值:
col1    0.041726
col2   -0.038841
col3    0.782879
dtype: float64