主頁 > 後端開發 > python資料分析之pandas超詳細學習筆記

python資料分析之pandas超詳細學習筆記

2021-04-07 10:20:59 後端開發

文章目錄

    • 前言
    • 一、series
        • 1、創建一個series資料(默認索引值)
        • 2、創建一個series資料(自定義默認值)
        • 3、獲取series的資料值
        • 4、用字典來構建一個series資料
    • 二、DataFrame
        • 1、創建一個DataFrame資料
        • 2、自定義行和列的值
        • 3、獲取值、行索引、列索引、轉置
        • 4、獲取統計變數
        • 5、根據行、列、值進行排序
    • 三、pandas選擇資料
        • 1、獲取一列的series資料和行資料
        • 2、通過標簽獲取資料
        • 3、通過位置獲取資料
        • 4、對某一列的資料進行判斷
    • 四、pandas賦值及操作
        • 1、替換原有值
        • 2、插入行、列
        • 3、洗掉行、列
    • 五、pandas對于空資料的處理
        • 1、洗掉空值所在的行或者列
        • 2、對空值進行賦值
        • 3、判斷資料是否為空值
    • 六、pandas讀取和存入csv檔案
        • 1、讀取檔案
        • 2、保存檔案
    • 七、pandas合并
        • 1、橫向拼接、縱向拼接
        • 2、獲取兩個表的交集和并集
    • 八、pandas合并——merge
    • 九、pandas plot 畫圖函式
    • 十、 參考文章及學習視頻
    • 十一、Blogger’s speech


  • 前排提醒:這篇(偽萬字)文章篇幅略大,建議收藏觀看,

作者:遠方的星
CSDN:https://blog.csdn.net/qq_44921056
騰訊云:https://cloud.tencent.com/developer/column/91164
本文僅用于交流學習,未經作者允許,禁止轉載,更勿做其他用途,違者必究,


前言

  • pandas,python+data+analysis的組合縮寫,是python中基于numpy和matplotlib的第三方資料分析庫,與后兩者共同構成了python資料分析的基礎工具包,享有數分三劍客之名,

文章開始前,需要進行庫的安裝:
打開cmd,依次輸入以下三個命令即可,

pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

這里使用的是清華源,提高安裝速度,

一、series

series是一個一維陣列,線性的資料結構,

1、創建一個series資料(默認索引值)

  • 使用pandas.Series()函式
import pandas as pd

# 創建一個series資料,默認索引值
s1 = pd.Series([1, 3, 14, 521])
print(s1)

輸出:

0      1
1      3
2     14
3    521
dtype: int64

提示:命名檔案的時候檔案命不要以pandas命名,

  • 如果報錯,可參考:AttributeError: module ‘pandas‘ has no attribute ‘Series‘

2、創建一個series資料(自定義默認值)

import pandas as pd

# 創建一個series資料,索引值自定義
s2 = pd.Series([1, 3, 14, 521], index=['第一個數', '第二個數', '第三個數', '第四個數'])
print(s2)

輸出:

第一個數      1
第二個數      3
第三個數     14
第四個數    521
dtype: int64

3、獲取series的資料值

  • 使用pandas.values()函式
import pandas as pd

# 提取series的資料的值
s3 = pd.Series([1, 3, 14, 521])
# 直接獲取值
print(s3.values)
print('-------分割線-------')
# 根據索引獲取值
print(s3[0:3])

輸出:

[  1   3  14 521]
-------分割線-------
0     1
1     3
2    14
dtype: int64

4、用字典來構建一個series資料

series可以看作一個定長的有序字典

import pandas as pd

dict = {"數學": 130, "專業課": 140, "政治": 80, "英語": 70}
s4 = pd.Series(dict)
print(s4)

輸出:

數學     130
專業課    140
政治      80
英語      70
dtype: int64

二、DataFrame

1、創建一個DataFrame資料

  • 使用pandas.DataFrame函式

①:

import pandas as pd

data = {
    'class': [1, 2, 3, 4],
    'people': [16, 15, 17, 18]
}
df1 = pd.DataFrame(data)
print(df1)

輸出:

   class  people
0      1      16
1      2      15
2      3      17
3      4      18

②:利用np.arange()函式,用法可參考np.arange()用法

import pandas as pd
import numpy as np
df2 = pd.DataFrame(np.arange(8).reshape(2, 4))
print(df2)

輸出:

   0  1  2  3
0  0  1  2  3
1  4  5  6  7

2、自定義行和列的值

import pandas as pd
import numpy as np
df3 = pd.DataFrame(np.arange(8).reshape(2, 4), index=['a', 'b'], columns=['11', '22', '33', '44'])
print(df3)

輸出:

   11  22  33  44
a   0   1   2   3
b   4   5   6   7

3、獲取值、行索引、列索引、轉置

  • 使用valuesindexcolumnsaxesT
import pandas as pd
import numpy as np
df4 = pd.DataFrame(np.arange(8).reshape(2, 4), index=['a', 'b'], columns=['11', '22', '33', '44'])
print('--------原資料-------')
print(df4)
print('-------獲取值--------')
print(df4.values)
print('-------獲取行索引--------')
print(df4.index)
print('-------獲取列索引--------')
print(df4.columns)
print('-------獲取行及列的索引值--------')
print(df4.axes)
print('-------獲取轉置-------')
print(df4.T)

輸出:

--------原資料-------
   11  22  33  44
a   0   1   2   3
b   4   5   6   7
-------獲取值--------
[[0 1 2 3]
 [4 5 6 7]]
-------獲取行索引--------
Index(['a', 'b'], dtype='object')
-------獲取列索引--------
Index(['11', '22', '33', '44'], dtype='object')
-------獲取行及列的索引值--------
[Index(['a', 'b'], dtype='object'), Index(['11', '22', '33', '44'], dtype='object')]
-------獲取轉置值-------
    a  b
11  0  4
22  1  5
33  2  6
44  3  7

4、獲取統計變數

  • 使用pandas.describe()函式
import pandas as pd

data = {'year': [2018, 2019, 2020, 2021],
        'income': [10000, 20000, 30000, 40000],
        'pay': [5000, 15000, 20000, 30000]
}
df5 = pd.DataFrame(data)
print(df5.describe())

輸出:

              year        income           pay
count     4.000000      4.000000      4.000000
mean   2019.500000  25000.000000  17500.000000
std       1.290994  12909.944487  10408.329997
min    2018.000000  10000.000000   5000.000000
25%    2018.750000  17500.000000  12500.000000
50%    2019.500000  25000.000000  17500.000000
75%    2020.250000  32500.000000  22500.000000
max    2021.000000  40000.000000  30000.000000

注解:

   count:數量統計,此列共有多少有效值
   mean:均值
   std:標準差
   min:最小值
   25%:四分之一分位數
   50%:二分之一分位數
   75%:四分之三分位數
   max:最大值
   

5、根據行、列、值進行排序

  • 使用sort_index()sort_values()
import pandas as pd
import numpy as np
df6 = pd.DataFrame(np.arange(8).reshape(2, 4), index=['b', 'a'], columns=['22', '11', '44', '33'])
print('--------原資料-------')
print(df6)
print('--------行排序-------')
print(df6.sort_index(axis=0))
print('--------列排序-------')
print(df6.sort_index(axis=1))
print('--------值排序(對33列里的值進行排序)-------')
print(df6.sort_values(by='33'))

輸出:

--------原資料-------
   22  11  44  33
b   0   1   2   3
a   4   5   6   7
--------行排序-------
   22  11  44  33
a   4   5   6   7
b   0   1   2   3
--------列排序-------
   11  22  33  44
b   1   0   3   2
a   5   4   7   6
--------值排序(33列里的值進行排序)-------
   22  11  44  33
b   0   1   2   3
a   4   5   6   7

三、pandas選擇資料

import pandas as pd
import numpy as np
dates = pd.date_range('20210301', periods=6)
df1 = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=['A', 'B', 'C', 'D'])
print(df1)

輸出:

             A   B   C   D
2021-03-01   0   1   2   3
2021-03-02   4   5   6   7
2021-03-03   8   9  10  11
2021-03-04  12  13  14  15
2021-03-05  16  17  18  19
2021-03-06  20  21  22  23
  • 注:以下所有操作均以上述結果為基礎

1、獲取一列的series資料和行資料

print('----將DataFrame的一個列獲取為一個series資料----')
a = df1.A  # 或者寫成 df1['A']
print(a)
print('-------獲取前兩行資料------')
print(df1[0:2])

輸出:

----將DataFrame的一個列獲取為一個series資料----
2021-03-01     0
2021-03-02     4
2021-03-03     8
2021-03-04    12
2021-03-05    16
2021-03-06    20
Freq: D, Name: A, dtype: int32
-------獲取前兩行資料------
            A  B  C  D
2021-03-01  0  1  2  3
2021-03-02  4  5  6  7

2、通過標簽獲取資料

  • 使用loc
print('------行標簽-----')
print(df1.loc['20210302'])
print('------行和列混合標簽--------')
print(df1.loc['20210301', ['A', 'C']])
print('-------全選行但不全選列-------')
print(df1.loc[:, ['A', 'C']])
print('-------全選列但不全選行-------')
print(df1.loc[['20210302', '20210304'], :])

輸出:

------行標簽-----
A    4
B    5
C    6
D    7
Name: 2021-03-02 00:00:00, dtype: int32
------行和列混合標簽--------
A    0
C    2
Name: 2021-03-01 00:00:00, dtype: int32
-------全選行但不全選列-------
             A   C
2021-03-01   0   2
2021-03-02   4   6
2021-03-03   8  10
2021-03-04  12  14
2021-03-05  16  18
2021-03-06  20  22
-------全選列但不全選行-------
             A   B   C   D
2021-03-02   4   5   6   7
2021-03-04  12  13  14  15

3、通過位置獲取資料

  • 使用iloc
print('-------第四行------')
print(df1.iloc[3])
print('-------二到三行,三到四列------')
print(df1.iloc[1:3, 2:4])
print('-------第2,3,4行,3、4列')
print(df1.iloc[[1, 2, 3], [2, 3]])

輸出:

-------第四行------
A    12
B    13
C    14
D    15
Name: 2021-03-04 00:00:00, dtype: int32
-------二到三行,三到四列------
             C   D
2021-03-02   6   7
2021-03-03  10  11
-------234行,34列
             C   D
2021-03-02   6   7
2021-03-03  10  11
2021-03-04  14  15

4、對某一列的資料進行判斷

print(df1.A)
print('---------------------分割線--------------------')
print(df1.A > 6)

輸出:

2021-03-01     0
2021-03-02     4
2021-03-03     8
2021-03-04    12
2021-03-05    16
2021-03-06    20
Freq: D, Name: A, dtype: int32
---------------------分割線--------------------
2021-03-01    False
2021-03-02    False
2021-03-03     True
2021-03-04     True
2021-03-05     True
2021-03-06     True
Freq: D, Name: A, dtype: bool

四、pandas賦值及操作

import pandas as pd
import numpy as np
dates = pd.date_range('20210301', periods=6)
df1 = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=['A', 'B', 'C', 'D'])
print(df1)

輸出:

             A   B   C   D
2021-03-01   0   1   2   3
2021-03-02   4   5   6   7
2021-03-03   8   9  10  11
2021-03-04  12  13  14  15
2021-03-05  16  17  18  19
2021-03-06  20  21  22  23
  • 以下結果均為上述為基礎

1、替換原有值

①根據位置替換資料

df1.iloc[1, 2] = 100
print(df1)

輸出:

             A   B    C   D
2021-03-01   0   1    2   3
2021-03-02   4   5  100   7
2021-03-03   8   9   10  11
2021-03-04  12  13   14  15
2021-03-05  16  17   18  19
2021-03-06  20  21   22  23

②根據標簽替換資料

df1.loc["20210304", 'B'] = 200
print(df1)

輸出:

             A    B   C   D
2021-03-01   0    1   2   3
2021-03-02   4    5   6   7
2021-03-03   8    9  10  11
2021-03-04  12  200  14  15
2021-03-05  16   17  18  19
2021-03-06  20   21  22  23

③根據條件替換資料
Ⅰ.

df1[df1.D > 10] = 0  # df1.D > 10的作用是找到D列資料大于10的所有行資料
print(df1)

輸出:

            A  B  C  D
2021-03-01  0  1  2  3
2021-03-02  4  5  6  7
2021-03-03  0  0  0  0
2021-03-04  0  0  0  0
2021-03-05  0  0  0  0
2021-03-06  0  0  0  0

Ⅱ.

df1.A[df1.A == 8] = 300  # 找到A列等于8的所有資料,并替換成300
print(df1)

輸出:

              A   B   C   D
2021-03-01    0   1   2   3
2021-03-02    4   5   6   7
2021-03-03  300   9  10  11
2021-03-04   12  13  14  15
2021-03-05   16  17  18  19
2021-03-06   20  21  22  23

2、插入行、列

①通過series資料的形式插入

df1['F'] = pd.Series(['1', '2', '3', '4', '5', '6'], index=dates)
print(df1)

輸出:

             A   B   C   D  F
2021-03-01   0   1   2   3  1
2021-03-02   4   5   6   7  2
2021-03-03   8   9  10  11  3
2021-03-04  12  13  14  15  4
2021-03-05  16  17  18  19  5
2021-03-06  20  21  22  23  6

②通過append函式插入(行操作)

s = pd.Series([1, 2, 3, 4], index=['A', 'B', 'C', 'D'])
s.name = 'new'
df2 = df1.append(s)
print(df2)

輸出:

                      A   B   C   D
2021-03-01 00:00:00   0   1   2   3
2021-03-02 00:00:00   4   5   6   7
2021-03-03 00:00:00   8   9  10  11
2021-03-04 00:00:00  12  13  14  15
2021-03-05 00:00:00  16  17  18  19
2021-03-06 00:00:00  20  21  22  23
new                   1   2   3   4

③通過insert函式插入(列操作)

df1.insert(2, 'E', [1, 2, 3, 4, 5, 6])  # 在第二列的右邊插入一個新的E列
print(df1)

輸出:

             A   B  E   C   D
2021-03-01   0   1  1   2   3
2021-03-02   4   5  2   6   7
2021-03-03   8   9  3  10  11
2021-03-04  12  13  4  14  15
2021-03-05  16  17  5  18  19
2021-03-06  20  21  6  22  23

3、洗掉行、列

①洗掉行

df2 = df1.drop('20210302', axis=0)  # 洗掉20210302行
print(df2)

這里報錯了!!!

具體博主還沒有解決,但我試了另外一個例子是可以運行的,請看:

import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.arange(24).reshape((6, 4)), index=['1', '2', '3', '4', '5', '6'], columns=['A', 'B', 'C', 'D'])
df2 = df1.drop('2', axis=0)  # 洗掉‘2’行
print('--------------原資料--------------')
print(df1)
print('--------------洗掉后的資料-------------')
print(df2)

輸出:

--------------原資料--------------
    A   B   C   D
1   0   1   2   3
2   4   5   6   7
3   8   9  10  11
4  12  13  14  15
5  16  17  18  19
6  20  21  22  23
--------------洗掉后的資料-------------
    A   B   C   D
1   0   1   2   3
3   8   9  10  11
4  12  13  14  15
5  16  17  18  19
6  20  21  22  23

這里是成功把‘2’這行給洗掉掉了,

②洗掉列

df2 = df1.drop('A', axis=1)  # 洗掉A列
print(df2)

輸出:

             B   C   D
2021-03-01   1   2   3
2021-03-02   5   6   7
2021-03-03   9  10  11
2021-03-04  13  14  15
2021-03-05  17  18  19
2021-03-06  21  22  23

五、pandas對于空資料的處理

import pandas as pd
import numpy as np
dates = pd.date_range('20210301', periods=6)
df1 = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=['A', 'B', 'C', 'D'])
df2 = pd.DataFrame(df1, index=dates, columns=['A', 'B', 'C', 'D', 'E', 'F'])
s1 = pd.Series([3, 4, 6, 7], index=dates[:4])  # 對第一個到第四個資料進行賦值
s2 = pd.Series([32, 5, 2, 1], index=dates[2:])  # 對第三個資料到最后一個資料進行賦值
df2['E'] = s1
df2['F'] = s2
print(df2)

輸出:

             A   B   C   D    E     F
2021-03-01   0   1   2   3  3.0   NaN
2021-03-02   4   5   6   7  4.0   NaN
2021-03-03   8   9  10  11  6.0  32.0
2021-03-04  12  13  14  15  7.0   5.0
2021-03-05  16  17  18  19  NaN   2.0
2021-03-06  20  21  22  23  NaN   1.0
  • 以下結果均為上述為基礎

1、洗掉空值所在的行或者列

  • 使用dropna函式
# axis中的0代表行,1代表列,how中的any表示,含有空值即洗掉 ,all代表全部為空值才洗掉
print(df2.dropna(axis=0, how='any'))

輸出:

             A   B   C   D    E     F
2021-03-03   8   9  10  11  6.0  32.0
2021-03-04  12  13  14  15  7.0   5.0

2、對空值進行賦值

  • 使用fillna函式
# 對空值進行賦值,此處賦值為100
print(df2.fillna(value=100))

輸出:

             A   B   C   D      E      F
2021-03-01   0   1   2   3    3.0  100.0
2021-03-02   4   5   6   7    4.0  100.0
2021-03-03   8   9  10  11    6.0   32.0
2021-03-04  12  13  14  15    7.0    5.0
2021-03-05  16  17  18  19  100.0    2.0
2021-03-06  20  21  22  23  100.0    1.0

3、判斷資料是否為空值

  • 使用isnull函式,空值回傳True,非空值回傳Flase
print(df2.isnull())

輸出:

                A      B      C      D      E      F
2021-03-01  False  False  False  False  False   True
2021-03-02  False  False  False  False  False   True
2021-03-03  False  False  False  False  False  False
2021-03-04  False  False  False  False  False  False
2021-03-05  False  False  False  False   True  False
2021-03-06  False  False  False  False   True  False

六、pandas讀取和存入csv檔案

1、讀取檔案

file = pd.read_csv('csv檔案的路徑', encoding='編碼格式')  # 編碼格式如gbk,utf-8等

2、保存檔案

file.to_csv('檔案要保存到的路徑')

七、pandas合并

1、橫向拼接、縱向拼接

  • 新建三個dataframe資料
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.arange(12).reshape((3,4)),columns=['a','b','c','d'])
df2 = pd.DataFrame(np.arange(12,24).reshape((3,4)),columns=['a','b','c','d'])
df3 = pd.DataFrame(np.arange(24,36).reshape((3,4)),columns=['a','b','c','d'])
print(df1)
print(df2)
print(df3)

輸出:

   a  b   c   d
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11
    a   b   c   d
0  12  13  14  15
1  16  17  18  19
2  20  21  22  23
    a   b   c   d
0  24  25  26  27
1  28  29  30  31
2  32  33  34  35
  • 實作橫向和縱向合并
df4 = pd.concat([df1,df2,df3],axis=0)#縱向合并
df5 = pd.concat([df1,df2,df3],axis=1)#橫向合并
print('---------------縱向合并結果---------------')
print(df4)
print('---------------橫向合并結果---------------')
print(df5)

輸出:

---------------縱向合并結果---------------
    a   b   c   d
0   0   1   2   3
1   4   5   6   7
2   8   9  10  11
0  12  13  14  15
1  16  17  18  19
2  20  21  22  23
0  24  25  26  27
1  28  29  30  31
2  32  33  34  35
---------------橫向合并結果---------------
   a  b   c   d   a   b   c   d   a   b   c   d
0  0  1   2   3  12  13  14  15  24  25  26  27
1  4  5   6   7  16  17  18  19  28  29  30  31
2  8  9  10  11  20  21  22  23  32  33  34  35
  • 細心的小伙伴可能已經發現了,縱向合并時,index值看上去不太舒服,可以在上述代碼的基礎上加以補充,實作index值的改變,
df4 = pd.concat([df1,df2,df3],axis=0,ignore_index=True)  # ignore_index=True的作用是不考慮表原來的index
print(df4)

輸出:

    a   b   c   d
0   0   1   2   3
1   4   5   6   7
2   8   9  10  11
3  12  13  14  15
4  16  17  18  19
5  20  21  22  23
6  24  25  26  27
7  28  29  30  31
8  32  33  34  35

2、獲取兩個表的交集和并集

join引數的屬性,如果為’inner’得到的是兩表的交集,如果是outer,得到的是兩表的并集,

  • 新建兩個dataframe資料
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.arange(12).reshape((3,4)),columns=['a','b','c','f'])
df2 = pd.DataFrame(np.arange(12,24).reshape((3,4)),columns=['a','c','d','e'])
print(df1)
print(df2)

輸出:

   a  b   c   f
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11
    a   c   d   e
0  12  13  14  15
1  16  17  18  19
2  20  21  22  23
  • 實作得到兩張表的交集和并集
df3 = pd.concat([df1,df2],join='outer',ignore_index=True)
df4 = pd.concat([df1,df2],join='inner',ignore_index=True)
print('------------------并集結果-------------------')
print(df3)
print('------------------交集結果-------------------')
print(df4)

輸出:

------------------并集結果-------------------
    a    b   c     f     d     e
0   0  1.0   2   3.0   NaN   NaN
1   4  5.0   6   7.0   NaN   NaN
2   8  9.0  10  11.0   NaN   NaN
3  12  NaN  13   NaN  14.0  15.0
4  16  NaN  17   NaN  18.0  19.0
5  20  NaN  21   NaN  22.0  23.0
------------------交集結果-------------------
    a   c
0   0   2
1   4   6
2   8  10
3  12  13
4  16  17
5  20  21

注意:去并集時,空值的地方用NaN填充

新版本pandas已經洗掉了join_axes,兩個dataframe按照同一列合并的話,可以改用merge

八、pandas合并——merge

  • 用字典新建兩個dataframe資料:
import pandas as pd
left = pd.DataFrame({'key1':['K0','K0','K1','K2'],
                     'key2':['K0','K1','K0','K1'],
                     'A':['A0','A1','A2','A3'],
                     'B':['B0','B1','B2','B3']})

right = pd.DataFrame({'key1':['K0','K1','K1','K3'],
                      'key2':['K0','K0','K0','K0'],
                     'C':['C0','C1','C2','C3'],
                     'D':['D0','D1','D2','D3']})

print(left)
print(right)

輸出:

  key1 key2   A   B
0   K0   K0  A0  B0
1   K0   K1  A1  B1
2   K1   K0  A2  B2
3   K2   K1  A3  B3
  key1 key2   C   D
0   K0   K0  C0  D0
1   K1   K0  C1  D1
2   K1   K0  C2  D2
3   K3   K0  C3  D3

  • 使用merge進行合并

  • on: 要加入的列或索引級別名稱, 必須在左側和右側DataFrame物件中找到,

  • 其中how有四個引數:inner、outer、left、right,默認值是inner, inner的作用是取交集;
    outer的作用是取并集;
    left的作用是只取左邊的表有值的情況;
    right的作用是只取右邊的表有值的情況,
    left和rigth的結果是outer的子集,

res_1 = pd.merge(left,right,on=['key1','key2'],how='inner')
res_2 = pd.merge(left,right,on=['key1','key2'],how='outer')
res_3 = pd.merge(left,right,on=['key1','key2'],how='left')
res_4 = pd.merge(left,right,on=['key1','key2'],how='right')
print('-------------------------how的引數取inner的結果--------------------')
print(res_1)
print('-------------------------how的引數取outer的結果--------------------')
print(res_2)
print('-------------------------how的引數取left的結果---------------------')
print(res_3)
print('-------------------------how的引數取right的結果--------------------')
print(res_4)

輸出:

-------------------------how的引數取inner的結果--------------------
  key1 key2   A   B   C   D
0   K0   K0  A0  B0  C0  D0
1   K1   K0  A2  B2  C1  D1
2   K1   K0  A2  B2  C2  D2
-------------------------how的引數取outer的結果--------------------
  key1 key2    A    B    C    D
0   K0   K0   A0   B0   C0   D0
1   K0   K1   A1   B1  NaN  NaN
2   K1   K0   A2   B2   C1   D1
3   K1   K0   A2   B2   C2   D2
4   K2   K1   A3   B3  NaN  NaN
5   K3   K0  NaN  NaN   C3   D3
-------------------------how的引數取left的結果---------------------
  key1 key2   A   B    C    D
0   K0   K0  A0  B0   C0   D0
1   K0   K1  A1  B1  NaN  NaN
2   K1   K0  A2  B2   C1   D1
3   K1   K0  A2  B2   C2   D2
4   K2   K1  A3  B3  NaN  NaN
-------------------------how的引數取right的結果--------------------
  key1 key2    A    B   C   D
0   K0   K0   A0   B0  C0  D0
1   K1   K0   A2   B2  C1  D1
2   K1   K0   A2   B2  C2  D2
3   K3   K0  NaN  NaN  C3  D3
  • 加入indicator引數可以查看merge的詳細資訊
    如:
res = pd.merge(left,right,on=['key1','key2'],how='outer',indicator=True)
print(res)

輸出:

  key1 key2    A    B    C    D      _merge
0   K0   K0   A0   B0   C0   D0        both
1   K0   K1   A1   B1  NaN  NaN   left_only
2   K1   K0   A2   B2   C1   D1        both
3   K1   K0   A2   B2   C2   D2        both
4   K2   K1   A3   B3  NaN  NaN   left_only
5   K3   K0  NaN  NaN   C3   D3  right_only

indicator的值也可以是字串引數,在這種情況下,指標函式將使用傳遞的字串的值作為指標列的名稱,

  • 以index為鏈接鍵需要同時設定left_index= True 和 right_index= True
    如:
res = pd.merge(left,right,left_index=True,right_index=True,how='outer')
print(res)

輸出:

  key1_x key2_x   A   B key1_y key2_y   C   D
0     K0     K0  A0  B0     K0     K0  C0  D0
1     K0     K1  A1  B1     K1     K0  C1  D1
2     K1     K0  A2  B2     K1     K0  C2  D2
3     K2     K1  A3  B3     K3     K0  C3  D3
  • sort對鏈接的鍵值進行排序:
res = pd.merge(left,right,on=['key1','key2'],how='outer',sort=True)
print(res)

輸出:

  key1 key2    A    B    C    D
0   K0   K0   A0   B0   C0   D0
1   K0   K1   A1   B1  NaN  NaN
2   K1   K0   A2   B2   C1   D1
3   K1   K0   A2   B2   C2   D2
4   K2   K1   A3   B3  NaN  NaN
5   K3   K0  NaN  NaN   C3   D3

九、pandas plot 畫圖函式

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data = pd.DataFrame(np.random.randn(1000,4),index=np.arange(1000),columns=['A','B','C','D'])
data = data.cumsum()
print(data.head())
data.plot()
plt.show()

輸出:
在這里插入圖片描述

注解:
1、numpy.random.randn():回傳一個或一組樣本,具有標準正態分布,此處為10004列的資料
2、data.head(),獲取data的前幾個資料,head的默認值為5
3、data.cumsum()的一個作用是可以求累加量

十、 參考文章及學習視頻

博文中有一些地方的例子是直接參考學習視頻中的例子,卑微博主在線感激!
下面是博主參考的一些其它博文和學習視頻,
pandas documentation
pandas快速入門
pandas plot的畫圖命令
學習視頻
參考文章5
參考文章6
參考文章7
參考文章8

十一、Blogger’s speech

如有不足,還請大佬評論區留言或私信我,我會進行補充,

感謝您的支持,希望可以點贊,關注,收藏,一鍵三連喲,

作者:遠方的星
CSDN:https://blog.csdn.net/qq_44921056
騰訊云:https://cloud.tencent.com/developer/column/91164
本文僅用于交流學習,未經作者允許,禁止轉載,更勿做其他用途,違者必究,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/273244.html

標籤:python

上一篇:制作Python數字華容道(可選擇關卡)

下一篇:2021-03-26

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more