P高阶_(pandas入门)

  • Post author:
  • Post category:其他




pandas 是做什么的


#!/usr/bin/python
# -*- coding: utf-8 -*-
#参考'https://www.pypandas.cn/'
import pandas as pd
import numpy as np
Pandas 适用于处理以下类型的数据:

与 SQL 或 Excel 表类似的,含异构列的表格数据;
有序和无序(非固定频率)的时间序列数据;
带行列标签的矩阵数据,包括同构或异构型数据;
任意其它形式的观测、统计数据集,数据转入 Pandas 数据结构时不必事先标记。



处理数据

'一维数据(Series),二维数据(DataFrame)'
'DataFrame 是 Series 的容器,Series 则是标量的容器'



数据结构

"Series"
'Series是带标签的一维数组,可存储整数、浮点数、字符串、Python 对象等类型的数据。
轴标签统称为索引'
data = 18
index = 1,  # 这里应该是个元祖或者数组等,不能为字符串或者数字
res = pd.Series(data=data, index=index)
print(res)
"""
1    18
dtype: int64
"""

data = 18
index = 1, 2, 3, 4  # 这里应该是个元祖或者数组等,不能为字符串或者数字
res = pd.Series(data=data, index=index)
print(f'data是标量,索引为多个-->')
print(res)
"""



data类型

  """
   标量
    多维数组
    PYTHON字典
"""



多维数组

data = [18, 19]
index = [1, 2, ]
res = pd.Series(data=data, index=index)
print(f'data是多维数组-->')
print(res)

'不指定索引'
data = [18, 19]

res = pd.Series(data=data)  # [0,.....,len(data)-1]
print(f'不指定索引-->')
print(res)
"""
0    18
1    19
dtype: int64
"""



字典

'data 为字典,且未设置 index 参数时,如果 Python 版本 >= 3.6 且 Pandas 版本 >= 0.23,Series 按字典的插入顺序排序索引。'
data = {"b小A": "吃饭", "a小B": "没吃饭"}
res = pd.Series(data=data)
print(f'data是字典-->')
print(res)
"""
b小A     吃饭
a小B    没吃饭
dtype: object
"""

res = pd.Series(data=data, index=["a小B", "B小a"])
print(f'有索引有字典取值-->')
print(res)
"""
a小B    没吃饭
B小a    NaN
dtype: object
"""



Series 类似多维数组

res = pd.Series(["A", "B", "C"], index=['小A', '小B', '小C'])
'索引'
print(f'索引2-->')
print(res[2])  # C

print(f'索引[0:2]-->')
print(res[:2])
"""
小A    A
小B    B
dtype: object
"""

# Series 是扩展数组 (opens new window),Series.to_numpy() 返回的是 NumPy 多维数组。
'Series.array用于提取 data数据、数组。'

res_array = res.array
print(f'array用于提取数组')
print(res_array)
"""
<PandasArray>
['A', 'B', 'C']
Length: 3, dtype: object
"""

res_li = res.tolist()  # python 原生数组
print(res_li)  # ['A', 'B', 'C']
res_numpy = res.to_numpy()  # NumPy 多维数组。
print(res_numpy)  # ['A' 'B' 'C']

'取索引'
res_index = res.get("小D", )
print(res_index)  # None
res_index = res.get("小D", np.nan)
print(res_index)  # nan

"加减乘除"
'最好用标量或者数值'
print(res + res)
print(res * 2)
print("**************")



DataFrame

"""
DataFrame 是由多种类型的列构成的二维标签数据结构,类似于 Excel 、SQL 表,或 Series 对象构成的字典。
DataFrame 是最常用的 Pandas 对象,与 Series 一样,DataFrame 支持多种类型的输入数据:

一维 ndarray、列表、字典、Series 字典
二维 numpy.ndarray
结构多维数组或记录多维数组(opens new window)
Series
DataFrame

除了数据,还可以有选择地传递 index(行标签)和 columns(列标签)参数。
传递了索引或列,就可以确保生成的 DataFrame 里包含索引或列。Series 字典加上指定索引时,
会丢弃与传递的索引不匹配的所有数据。
没有传递轴标签时,按常规依据输入数据进行构建
"""



字典生成

'生成的索引是每个 Series 索引的并集。先把嵌套字典转换为 Series。如果没有指定列,DataFrame 的列就是字典键的有序列表'
'对比Seriies和DataFrame'
data = {"name": pd.Series(["A", "B", "C"], index=['小A', '小B', '小C']),
        "name1": pd.Series(["A", "B", "C"], index=['小A', '小B', '小C'])
        }
res_dict = pd.DataFrame(data)
#
print(res_dict)
print(1111111111111)

res = pd.Series(["A", "B", "C"], index=['小A', '小B', '小C'])
print(res)
"""
小A    A
小B    B
小C    C
dtype: object
"""



多维数组

#多维数组字典、列表字典生成 DataFrame

data = {'one': [1., 2., 3., 4.], 'two': [4., 3., 2., 1.]}
res = pd.DataFrame(data)
print(res)
"""
   one  two
0  1.0  4.0
1  2.0  3.0
2  3.0  2.0
3  4.0  1.0
"""



结构多维数组

# 用结构多维数组或记录多维数组生成 DataFrame
data = np.zeros((2,), dtype=[('A', 'i4'), ('B', 'f4'), ('C', 'a10')])
'[(0, 0., b'') (0, 0., b'')]'
data[:] = [(1, 2., 'Hello'), (2, 3., "World")]  # 填充
res = pd.DataFrame(data, index=['first', 'second'])
print("列表嵌元祖,修改索引")
print(res)

"""
        A    B         C
first   1  2.0  b'Hello'
second  2  3.0  b'World'
"""
res = pd.DataFrame(data, columns=['C', 'A', 'B'])
print("列表嵌元祖,修改列名称")
print(res)
"""
          C  A    B
0  b'Hello'  1  2.0
1  b'World'  2  3.0
"""



列表字典

'用列表字典生成 DataFrame'
data = [{'a': 1, 'b': 2, 'c': 3}, {'a': 5, 'b': 10, 'c': 20}]
res = pd.DataFrame(data, index=['first', 'second'])
print("列表嵌字典,修改索引")
print(res)
"""
        a   b     c
first   1   2   3
second  5  10  20.0
"""
res = pd.DataFrame(data, columns=['a', 'b', 'c'])
print("列表嵌字典,修改列名称")
print(res)
"""
   a   b   c
0  1   2   3
1  5  10  20
"""



DataFrame.from_dict

'收字典组成的字典或数组序列字典'
res = pd.DataFrame.from_dict(dict([('A', [1, 2, 3]), ('B', [4, 5, 6])]))
print("DataFrame.from_dict")
print(res)
"""
   A  B
0  1  4
1  2  5
2  3  6
"""

'把 orient 参数设置为 index, 即可把字典的键作为行标签'
res = pd.DataFrame.from_dict(dict([('A', [1, 2, 3]), ('B', [4, 5, 6])]),
                             orient='index', columns=['one', 'two', 'three'])

print("index变成orient")
print(res)
"""
   one  two  three
A    1    2      3
B    4    5      6
"""



DataFrame.from_records

'元祖'

data = np.zeros((2,), dtype=[('A', 'i4'), ('B', 'f4'), ('C', 'a10')])
res_tuple = pd.DataFrame({('a', 'b'): {('A', 'B'): 1, ('A', 'C'): 2},
                          ('a', 'a'): {('A', 'C'): 3, ('A', 'B'): 4},
                          ('a', 'c'): {('A', 'B'): 5, ('A', 'C'): 6},
                          ('b', 'a'): {('A', 'C'): 7, ('A', 'B'): 8},
                          ('b', 'b'): {('A', 'D'): 9, ('A', 'B'): 10}})
print("元祖")  # 。。。。
print(res_tuple)

"""
       a              b      
       b    a    c    a     b
A B  1.0  4.0  5.0  8.0  10.0
  C  2.0  3.0  6.0  7.0   NaN
  D  NaN  NaN  NaN  NaN   9.0
"""



提取、添加、删除列

re

s = pd.DataFrame.from_dict(dict([('A', [1, 2, 3]), ('B', [4, 5, 6])]),
                             orient='index', columns=['one', 'two', 'three'])
print("提取")
print(res["one"])

res['three'] = res['one'] * res['two']
res['flag'] = res['one'] > 2  # 用法好奇怪--
print("这是相乘赋值")
print(res)
"""
   one  two  three   flag
A    1    2      2  False
B    4    5     20   True
"""

del res['two']  # 删除第二列
three = res.pop('three')  # 删除第三列
print("删除二三列")
print(res)

"""
   one   flag
A    1  False
B    4   True
"""



添加

'可以插入原生多维数组,但长度必须与 DataFrame 索引长度一致'

res = res.insert(1, 'bar', res['one'])
print("插入")
print(res)
"""
one  bar   flag  foo  one_trunc
a  1.0  1.0  False  bar        1.0
b  2.0  2.0  False  bar        2.0
c  3.0  3.0   True  bar        NaN
d  NaN  NaN  False  bar        NaN
"""



方法链

'用方法链分配新列'
dfa = pd.DataFrame({"A": [1, 2, 3],
                    "B": [4, 5, 6]})
dfa.assign(C=lambda x: x['A'] + x['B'],
           D=lambda x: x['A'] + x['C'])
print("后面等于前面相加")
print(dfa)

"第二个表达式里,x['C'] 引用刚创建的列,与 dfa['A'] + dfa['B'] 等效。"



索引

索引/选择'

"""
索引基础用法如下:

操作                 句法             结果
选择列                df[col]            Series
用标签选择行         df.loc[label]  Series
用整数位置选择行       df.iloc[loc]   Series
行切片                df[5:10]       DataFrame
用布尔向量选择行       df[bool_vec]   DataFrame

"""
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
                  index=['cobra', 'viper', 'sidewinder'],
                  columns=['max_speed', 'shield'])
print('初始化值')
print(df)
"""
            max_speed  shield
cobra               1       2
viper               4       5
sidewinder          7       8
"""
res = df.loc['viper']

print("loc输出一行值")
print(res)
"""
max_speed    4
shield       5
Name: viper, dtype: int64
"""
res = df.iloc[0]

print("iloc输出一列值")
print(res)
"""
max_speed    1
shield       2
Name: cobra, dtype: int64
"""



转置

"类似于多维数组,T 属性(即 transpose 函数)可以转置 DataFrame:"

index = pd.date_range('1/1/2000', periods=8)  # 参源码,日期
print("索引")
print(index)
df = pd.DataFrame(np.random.randn(8, 3), index=index, columns=list('ABC'))
print("转置前的")
print(df)
print("转置后的")
print(df[:5].T)



控制台打印

# res = pd.DataFrame(data=5,index=list([i for i in range(5)]))
''
res = pd.DataFrame({"ONE": pd.Series(data=5, index=[i for i in range(5)]),
                    "TWO": pd.Series(data=6, index=[1, 2, 3, 4, 5, 6])})
print("DataFrame用字典创建")
print(res)
"""
   ONE  TWO
0  5.0  NaN
1  5.0  6.0
2  5.0  6.0
3  5.0  6.0
4  5.0  6.0
5  NaN  6.0
6  NaN  6.0
"""
print("主要信息")
print(res.info())
"""
<class 'pandas.core.frame.DataFrame'>
Int64Index: 7 entries, 0 to 6
Data columns (total 2 columns):
Column  Non-Null Count           Dtype  
---     ------   --------------  -----  
 0      ONE      5 non-null      float64
 1      TWO      6 non-null      float64
dtypes: float64(2)
memory usage: 168.0 bytes
None
"""

'如果行太宽,指定行宽数值,默认值为 80'
pd.set_option('display.max_colwidth', 30)



版权声明:本文为wuhaotongxue原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。