• python学习 数据分析模块pandas


    目录

    生成一维数组

    生成DataFrame

    二维数据查看

    查看二维数据的索引、列名和数据

     查看数据的统计信息

    二维数据转置

    排序

    数据选择

    所有求和等于特定值的行

    数据修改

    对行求和,增加一列;对列求和,增加一行

    缺失值处理

    重复值处理

    异常值处理

    拆分与合并/连接

    分组计算


    pandas主要提供了3种数据结构:1)Series,带标签的一维数组;2)DataFrame,带标签且大小可变的二维表格结构;3)Panel,带标签且大小可变的三维数组。

    生成一维数组

    python中关于数据结构Series的讲解_C.DLording的博客-CSDN博客_series在python

    1. >>> import numpy as np
    2. >>> import pandas as pd
    3. >>> x = pd.Series([1, 3, 5, np.nan]) # np.nan表示空值、缺失值
    4. >>> x
    5. 0 1.0
    6. 1 3.0
    7. 2 5.0
    8. 3 NaN
    9. dtype: float64
    >>> dates = pd.date_range(start='20200101', end='20201231', freq='M')   # 间隔为月,每月最后一天
    

    生成DataFrame

    1. import numpy as np
    2. import matplotlib.pyplot as plt
    3. import matplotlib.font_manager as fm
    4. import pandas as pd
    5. dates = pd.date_range(start='20200101', end='20201231', freq='M')
    6. dataframe=pd.DataFrame(np.random.randn(12,4), index=dates, columns=list('ABCD'))
    7. print(dataframe)

    1. >>> pd.DataFrame([np.random.randint(1, 100, 4) for i in range(12)],
    2. index=dates, columns=list('ABCD')) # 4列随机数

    二维数据查看

    1. >>> df.head() # 默认显示前5行
    2. A B C D E F
    3. zhang 20 2020-01-01 1.0 3 test foo
    4. li 26 2020-01-02 2.0 3 train foo
    5. zhou 63 2020-01-03 3.0 3 test foo
    6. wang 69 2020-01-04 4.0 3 train foo
    7. >>> df.head(3) # 查看前3行
    8. A B C D E F
    9. zhang 20 2020-01-01 1.0 3 test foo
    10. li 26 2020-01-02 2.0 3 train foo
    11. zhou 63 2020-01-03 3.0 3 test foo
    12. >>> df.tail(2) # 查看最后2行
    13. A B C D E F
    14. zhou 63 2020-01-03 3.0 3 test foo
    15. wang 69 2020-01-04 4.0 3 train foo

    查看二维数据的索引、列名和数据

    1. print(df.index)
    2. print(df.columns)
    3. print(df.values)

     查看数据的统计信息

    >>> df.describe()   # 平均值、标准差、最小值、最大值等信息
    

    二维数据转置

    >>> df.T
    

    排序

    pandas(五)排序_风华浪浪的博客-CSDN博客

    数据选择

    注:这个地方选的是一个字段名 不是表格内的具体数值

    1. >>> df['A'] # 选择列
    2. zhang 20
    3. li 26
    4. zhou 63
    5. wang 69
    6. Name: A, dtype: int32
    7. >>> 69 in df['A'] # df['A']是一个Series对象
    8. False
    9. >>> 69 in df['A'].values
    10. True
    1. >>> df[0:2] # 使用切片选择多行
    2. A B C D E F
    3. zhang 20 2020-01-01 1.0 3 test foo
    4. li 26 2020-01-02 2.0 3 train foo
    5. >>> df.loc[:, ['A', 'C']] # 选择多列,等价于df[['A', 'C']]
    6. A C
    7. zhang 20 1.0
    8. li 26 2.0
    9. zhou 63 3.0
    10. wang 69 4.0
    1. >>> df.loc[['zhang', 'zhou'], ['A', 'D', 'E']]
    2. # 同时指定多行与多列进行选择
    3. A D E
    4. zhang 20 3 test
    5. zhou 63 3 test
    6. >>> df.loc['zhang', ['A', 'D', 'E']]
    7. A 20
    8. D 3
    9. E test
    10. Name: zhang, dtype: object
    1. >>> df.at['zhang', 'A'] # 查询指定行、列位置的数据值
    2. 20
    3. >>> df.at['zhang', 'D']
    4. 3
    5. >>> df.iloc[3] # 查询第3行数据
    6. A 69
    7. B 2020-01-04 00:00:00
    8. C 4
    9. D 3
    10. E train
    11. F foo
    12. Name: wang, dtype: object
    1. >>> df.iloc[0:3, 0:4] # 查询前3行、前4列数据
    2. A B C D
    3. zhang 20 2020-01-01 1.0 3
    4. li 26 2020-01-02 2.0 3
    5. zhou 63 2020-01-03 3.0 3
    6. >>> df.iloc[[0, 2, 3], [0, 4]] # 查询指定的多行、多列数据
    7. A E
    8. zhang 20 test
    9. zhou 63 test
    10. wang 69 train
    1. >>> df.iloc[0,1] # 查询第0行第1列位置的数据值
    2. Timestamp('2020-01-01 00:00:00')
    3. >>> df.iloc[2,2] # 查询第2行第2列位置的数据值
    4. 3.0
    5. >>> df[df.A>50] # 按给定条件进行查询
    6. A B C D E F
    7. zhou 63 2020-01-03 3.0 3 test foo
    8. wang 69 2020-01-04 4.0 3 train foo
    9. >>> df[df['E']=='test'] # 按给定条件进行查询
    10. A B C D E F
    11. zhang 20 2020-01-01 1.0 3 test foo
    12. zhou 63 2020-01-03 3.0 3 test foo
    13. >>> df[df['A'].isin([20,69])]
    14. A B C D E F
    15. zhang 20 2020-01-01 1.0 3 test foo
    16. wang 69 2020-01-04 4.0 3 train foo
    1. >>> df.nlargest(3, ['C']) # 返回指定列最大的前3行
    2. A B C D E F
    3. wang 69 2020-01-04 4.0 3 train foo
    4. zhou 63 2020-01-03 3.0 3 test foo
    5. li 26 2020-01-02 2.0 3 train foo
    6. >>> df.nlargest(3, ['A'])
    7. A B C D E F
    8. wang 69 2020-01-04 4.0 3 train foo
    9. zhou 63 2020-01-03 3.0 3 test foo
    10. li 26 2020-01-02 2.0 3 train foo

    所有求和等于特定值的行

    1. >>> dff = pd.DataFrame({'A':[1,2,3,4], 'B':[10,20,8,40]})
    2. >>> dff
    3. A B
    4. 0 1 10
    5. 1 2 20
    6. 2 3 8
    7. 3 4 40
    8. >>> dff[dff.sum(axis=1)==11]
    9. A B
    10. 0 1 10
    11. 2 3 8

    数据修改

    1. >>> df.iat[0, 2] = 3 # 修改指定行、列位置的数据值
    2. >>> df.loc[:, 'D'] = np.random.randint(50, 60, 4)
    3. # 修改某列的值
    4. >>> df['C'] = -df['C'] # 对指定列数据取反
    5. >>> df # 查看修改结果
    6. A B C D E F
    7. zhang 20 2020-01-01 -3.0 53 test foo
    8. li 26 2020-01-02 -2.0 59 train foo
    9. zhou 63 2020-01-03 -3.0 59 test foo
    10. wang 69 2020-01-04 -4.0 50 train foo
    1. >>> from copy import deepcopy
    2. >>> dff = deepcopy(df)
    3. >>> dff
    4. A B C D E F
    5. zhang 20 2020-01-01 -3.0 53 test foo
    6. li 26 2020-01-02 -2.0 59 train foo
    7. zhou 63 2020-01-03 -3.0 59 test foo
    8. wang 69 2020-01-04 -4.0 50 train foo
    9. >>> dff['C'] = dff['C'] ** 2 # 替换列数据
    10. >>> dff
    11. A B C D E F
    12. zhang 20 2020-01-01 9.0 53 test foo
    13. li 26 2020-01-02 4.0 59 train foo
    14. zhou 63 2020-01-03 9.0 59 test foo
    15. wang 69 2020-01-04 16.0 50 train foo
    1. >>> data = pd.DataFrame({'k1':['one'] * 3 + ['two'] * 4,
    2. 'k2':[1, 1, 2, 3, 3, 4, 4]})
    3. >>> data.replace(1, 5) # 把所有1替换为5
    4. k1 k2
    5. 0 one 5
    6. 1 one 5
    7. 2 one 2
    8. 3 two 3
    9. 4 two 3
    10. 5 two 4
    11. 6 two 4
    12. >>> data.replace([1,2],[5,6]) # 1->5,2->6
    13. k1 k2
    14. 0 one 5
    15. 1 one 5
    16. 2 one 6
    17. 3 two 3
    18. 4 two 3
    19. 5 two 4
    20. 6 two 4
    21. >>> data.replace({1:5, 'one':'ONE'}) # 使用字典指定替换关系
    22. k1 k2
    23. 0 ONE 5
    24. 1 ONE 5
    25. 2 ONE 2
    26. 3 two 3
    27. 4 two 3
    28. 5 two 4
    29. 6 two 4
    1. >>> data = pd.DataFrame({'k1':['one'] * 3 + ['two'] * 4,
    2. 'k2':[1, 1, 2, 3, 3, 4, 4]})
    3. >>> data
    4. k1 k2
    5. 0 one 1
    6. 1 one 1
    7. 2 one 2
    8. 3 two 3
    9. 4 two 3
    10. 5 two 4
    11. 6 two 4
    12. >>> data.drop(5, axis=0) # 删除指定行
    13. k1 k2
    14. 0 one 1
    15. 1 one 1
    16. 2 one 2
    17. 3 two 3
    18. 4 two 3
    19. 6 two 4
    20. >>> data.drop(3, inplace=True) # 原地删除
    21. >>> data
    22. k1 k2
    23. 0 one 1
    24. 1 one 1
    25. 2 one 2
    26. 4 two 3
    27. 5 two 4
    28. 6 two 4
    29. >>> data.drop('k1', axis=1) # 删除指定列
    30. k2
    31. 0 1
    32. 1 1
    33. 2 2
    34. 4 3
    35. 5 4
    36. 6 4
    1. >>> data = pd.DataFrame({'age':np.random.randint(20,50,5)})
    2. >>> data
    3. age
    4. 0 31
    5. 1 27
    6. 2 26
    7. 3 33
    8. 4 37
    9. >>> data['rank'] = data['age'].rank() # 增加一列位次序号
    10. >>> data
    11. age rank
    12. 0 31 3.0
    13. 1 27 2.0
    14. 2 26 1.0
    15. 3 33 4.0
    16. 4 37 5.0
    1. >>> data = pd.DataFrame({'姓名':['张三','李四','王五','赵六','刘七','孙八'],
    2. '成绩':[86,92,86,60,78,78]})
    3. >>> data
    4. 姓名 成绩
    5. 0 张三 86
    6. 1 李四 92
    7. 2 王五 86
    8. 3 赵六 60
    9. 4 刘七 78
    10. 5 孙八 78
    11. >>> data['排名'] = data['成绩'].rank(method='min') # 倒数名次,并列的取最小值
    12. >>> data
    13. 姓名 成绩 排名
    14. 0 张三 86 4.0
    15. 1 李四 92 6.0
    16. 2 王五 86 4.0
    17. 3 赵六 60 1.0
    18. 4 刘七 78 2.0
    19. 5 孙八 78 2.0
    20. >>> data['排名'] = data['成绩'].rank(method='min', ascending=False)
    21. >>> data # 正数名次,并列的名次取最小值
    22. 姓名 成绩 排名
    23. 0 张三 86 2.0
    24. 1 李四 92 1.0
    25. 2 王五 86 2.0
    26. 3 赵六 60 6.0
    27. 4 刘七 78 4.0
    28. 5 孙八 78 4.0
    29. >>> data['排名'] = data['成绩'].rank(method='max', ascending=False)
    30. >>> data # 正数名次,并列的名次取最大值
    31. 姓名 成绩 排名
    32. 0 张三 86 3.0
    33. 1 李四 92 1.0
    34. 2 王五 86 3.0
    35. 3 赵六 60 6.0
    36. 4 刘七 78 5.0
    37. 5 孙八 78 5.0
    38. >>> data['排名'] = data['成绩'].rank(method='max')
    39. >>> data # 倒数名次,并列的名次取最大值
    40. 姓名 成绩 排名
    41. 0 张三 86 5.0
    42. 1 李四 92 6.0
    43. 2 王五 86 5.0
    44. 3 赵六 60 1.0
    45. 4 刘七 78 3.0
    46. 5 孙八 78 3.0
    47. >>> data['排名'] = data['成绩'].rank(method='average')
    48. >>> data # 倒数名次,并列的名次取平均值
    49. 姓名 成绩 排名
    50. 0 张三 86 4.5
    51. 1 李四 92 6.0
    52. 2 王五 86 4.5
    53. 3 赵六 60 1.0
    54. 4 刘七 78 2.5
    55. 5 孙八 78 2.5

    对行求和,增加一列;对列求和,增加一行

    1. >>> dff = pd.DataFrame({'A':[1,2,3,4], 'B':[10,20,8,40]})
    2. >>> dff
    3. A B
    4. 0 1 10
    5. 1 2 20
    6. 2 3 8
    7. 3 4 40
    8. >>> dff['ColSum'] = dff.apply(sum, axis=1) # 对行求和,增加1列
    9. >>> dff.loc['RowSum'] = dff.apply(sum, axis=0) # 对列求和,增加1行
    10. >>> dff
    11. A B ColSum
    12. 0 1 10 11
    13. 1 2 20 22
    14. 2 3 8 11
    15. 3 4 40 44
    16. RowSum 10 78 88

    缺失值处理

    1. >>> df
    2. A B C D E F
    3. zhang 20 2020-01-01 9.0 53 test foo
    4. li 26 2020-01-02 4.0 59 train foo
    5. zhou 63 2020-01-03 9.0 59 test foo
    6. wang 69 2020-01-04 16.0 50 train foo
    7. >>> df1 = df.reindex(columns=list(df.columns) + ['G'])
    8. >>> df1
    9. A B C D E F G
    10. zhang 20 2020-01-01 9.0 53 test foo NaN
    11. li 26 2020-01-02 4.0 59 train foo NaN
    12. zhou 63 2020-01-03 9.0 59 test foo NaN
    13. wang 69 2020-01-04 16.0 50 train foo NaN
    1. >>> df1.iat[0, 6] = 3 # 修改指定位置元素值,该列其他元素为缺失值NaN
    2. >>> df1
    3. A B C D E F G
    4. zhang 20 2020-01-01 9.0 53 test foo 3.0
    5. li 26 2020-01-02 4.0 59 train foo NaN
    6. zhou 63 2020-01-03 9.0 59 test foo NaN
    7. wang 69 2020-01-04 16.0 50 train foo NaN
    1. >>> pd.isnull(df1) # 测试缺失值,返回值为True/False阵列
    2. A B C D E F G
    3. zhang False False False False False False False
    4. li False False False False False False True
    5. zhou False False False False False False True
    6. wang False False False False False False True
    1. >>> df1.dropna() # 返回不包含缺失值的行
    2. A B C D E F G
    3. zhang 20 2020-01-01 9.0 53 test foo 3.0
    4. >>> from copy import deepcopy
    5. >>> df2 = deepcopy(df1)
    6. >>> df1['G'].fillna(5, inplace=True) # 使用指定值填充缺失值
    7. >>> df1
    8. A B C D E F G
    9. zhang 20 2020-01-01 9.0 53 test foo 3.0
    10. li 26 2020-01-02 4.0 59 train foo 5.0
    11. zhou 63 2020-01-03 9.0 59 test foo 5.0
    12. wang 69 2020-01-04 16.0 50 train foo 5.0
    1. >>> df2.iat[2, 5] = np.NaN
    2. >>> df2
    3. A B C D E F G
    4. zhang 20 2020-01-01 1.0 53 test foo 3.0
    5. li 26 2020-01-02 4.0 59 train foo NaN
    6. zhou 63 2020-01-03 9.0 59 test NaN NaN
    7. wang 69 2020-01-04 16.0 50 train foo NaN
    8. >>> df2.dropna(thresh=6) # 返回包含6个有效值以上的数据
    9. A B C D E F G
    10. zhang 20 2020-01-01 1.0 53 test foo 3.0
    11. li 26 2020-01-02 4.0 59 train foo NaN
    12. wang 69 2020-01-04 16.0 50 train foo NaN
    1. >>> df2.iat[3, 6] = 8
    2. >>> df2
    3. A B C D E F G
    4. zhang 20 2020-01-01 1.0 53 test foo 3.0
    5. li 26 2020-01-02 4.0 59 train foo NaN
    6. zhou 63 2020-01-03 9.0 59 test NaN NaN
    7. wang 69 2020-01-04 16.0 50 train foo 8.0
    8. >>> df2.fillna({'F':'foo', 'G':df2['G'].mean()}) # 填充缺失值
    9. A B C D E F G
    10. zhang 20 2020-01-01 1.0 53 test foo 3.0
    11. li 26 2020-01-02 4.0 59 train foo 5.5
    12. zhou 63 2020-01-03 9.0 59 test foo 5.5
    13. wang 69 2020-01-04 16.0 50 train foo 8.0
    1. >>> import numpy as np
    2. >>> import pandas as pd
    3. >>> dft = pd.DataFrame({'a':[1,np.NaN, np.NaN,3]})
    4. >>> dft.fillna(method='pad') # 使用缺失值前最后一个有效值进行填充
    5. a
    6. 0 1.0
    7. 1 1.0
    8. 2 1.0
    9. 3 3.0
    10. >>> dft.fillna(method='bfill') # 使用缺失值后第一个有效值往回填充
    11. a
    12. 0 1.0
    13. 1 3.0
    14. 2 3.0
    15. 3 3.0
    16. >>> dft.fillna(method='bfill', limit=1) # 只填充一个缺失值
    17. a
    18. 0 1.0
    19. 1 NaN
    20. 2 3.0
    21. 3 3.0

    重复值处理

    1. >>> data = pd.DataFrame({'k1':['one'] * 3 + ['two'] * 4,
    2. 'k2':[1, 1, 2, 3, 3, 4, 4]})
    3. >>> data
    4. k1 k2
    5. 0 one 1
    6. 1 one 1
    7. 2 one 2
    8. 3 two 3
    9. 4 two 3
    10. 5 two 4
    11. 6 two 4
    12. >>> data.duplicated() # 检查重复行
    13. 0 False
    14. 1 True
    15. 2 False
    16. 3 False
    17. 4 True
    18. 5 False
    19. 6 True
    20. dtype: bool
    21. >>> data.drop_duplicates() # 返回新数组,删除重复行
    22. k1 k2
    23. 0 one 1
    24. 2 one 2
    25. 3 two 3
    26. 5 two 4
    27. >>> data.drop_duplicates(['k1']) # 删除k1列的重复数据,只保留第一项
    28. k1 k2
    29. 0 one 1
    30. 3 two 3
    31. >>> data.drop_duplicates(['k1'], keep='last') # 保留最后一项
    32. k1 k2
    33. 2 one 2
    34. 6 two 4
    35. >>> data = pd.Series([3,3,3,2,1,1,1,0])
    36. >>> data
    37. 0 3
    38. 1 3
    39. 2 3
    40. 3 2
    41. 4 1
    42. 5 1
    43. 6 1
    44. 7 0
    45. dtype: int64
    46. >>> data.drop_duplicates(keep=False) # 只保留出现一次的数字
    47. 3 2
    48. 7 0
    49. dtype: int64

    异常值处理

    拆分与合并/连接

    1. >>> df2 = pd.DataFrame(np.random.randn(10, 4))
    2. >>> df2
    3. 0 1 2 3
    4. 0 2.064867 -0.888018 0.586441 -0.660901
    5. 1 -0.465664 -0.496101 0.249952 0.627771
    6. 2 1.974986 1.304449 -0.168889 -0.334622
    7. 3 0.715677 2.017427 1.750627 -0.787901
    8. 4 -0.370020 -0.878282 0.499584 0.269102
    9. 5 0.184308 0.653620 0.117899 -1.186588
    10. 6 -0.364170 1.652270 0.234833 0.362925
    11. 7 -0.329063 0.356276 1.158202 -1.063800
    12. 8 -0.778828 -0.156918 -0.760394 -0.040323
    13. 9 -0.391045 -0.374825 -1.016456 0.767481
    14. >>> p1 = df2[:3] # 数据行拆分
    15. >>> p1
    16. 0 1 2 3
    17. 0 2.064867 -0.888018 0.586441 -0.660901
    18. 1 -0.465664 -0.496101 0.249952 0.627771
    19. 2 1.974986 1.304449 -0.168889 -0.334622
    20. >>> p2 = df2[3:7]
    21. >>> p3 = df2[7:]
    22. >>> df3 = pd.concat([p1, p2, p3]) # 数据行合并

    分组计算

    1. >>> df4 = pd.DataFrame({'A':np.random.randint(1,5,8),
    2. 'B':np.random.randint(10,15,8),
    3. 'C':np.random.randint(20,30,8),
    4. 'D':np.random.randint(80,100,8)})
    5. >>> df4
    6. A B C D
    7. 0 1 13 26 81
    8. 1 3 14 29 88
    9. 2 1 13 28 88
    10. 3 2 10 21 90
    11. 4 4 14 28 83
    12. 5 4 11 24 81
    13. 6 2 11 26 99
    14. 7 3 13 25 91
    1. >>> df4.groupby('A').sum() # 数据分组计算
    2. B C D
    3. A
    4. 1 26 54 169
    5. 2 21 47 189
    6. 3 27 54 179
    7. 4 25 52 164
    8. >>> df4.groupby(by=['A', 'B']).mean()
    9. C D
    10. A B
    11. 1 13 27.0 84.5
    12. 2 10 21.0 90.0
    13. 11 26.0 99.0
    14. 3 13 25.0 91.0
    15. 14 29.0 88.0
    16. 4 11 24.0 81.0
    17. 14 28.0 83.0
    18. >>> df4.groupby(by=['A', 'B'], as_index=False).mean()
    19. A B C D
    20. 0 1 13 27.0 84.5
    21. 1 2 10 21.0 90.0
    22. 2 2 11 26.0 99.0
    23. 3 3 13 25.0 91.0
    24. 4 3 14 29.0 88.0
    25. 5 4 11 24.0 81.0
    26. 6 4 14 28.0 83.0
    27. >>> df4.groupby(by=['A', 'B']).aggregate({'C':np.mean, 'D':np.min})
    28. # 分组后,C列使用平均值,D列使用最小值
    29. C D
    30. A B
    31. 1 13 27 81
    32. 2 10 21 90
    33. 11 26 99
    34. 3 13 25 91
    35. 14 29 88
    36. 4 11 24 81
    37. 14 28 83

  • 相关阅读:
    C++ 构造函数不能声明为虚函数的原因
    谁的孙子最多II
    【双系统 安装ADB】
    微信小程序Day4笔记
    数据的读取和保存-MATLAB
    linux文件锁的使用
    Lintcode 3715 · Lowest Common Ancestor V (最小祖先好题)
    《操作系统-真象还原》09. 线程
    考研大作文模板与实战(图表为主+部分图画)
    ruoyi权限设置的坑
  • 原文地址:https://blog.csdn.net/m0_62309595/article/details/126047240