ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Pandas

2022-08-07 15:33:22  阅读:173  来源: 互联网

标签:name df DataFrame pd print data Pandas


一、数据结构 Series

Pandas Series 类似表格中的一个列(column),类似于一维数组,可以保存任何数据类型

Series 由索引(index)和列组成,函数如下:

pandas.Series( data, index, dtype, name, copy)

参数说明:

  • data:一组数据(ndarray 类型)

  • index:数据索引标签,如果不指定,默认从 0 开始

  • dtype:数据类型,默认会自己判断

  • name:设置名称

  • copy:拷贝数据,默认为 False

 

1.Series 实例


a = [1, 2, 3, 4]
# 创建Series实例
se_data = pd.Series(a)

print(se_data)
print('-------------')

# 根据索引值读取数据
print('se_data[0]:', se_data[0])
print('se_data[3]:', se_data[3])

输出结果:

0    1
1    2
2    3
3    4
dtype: int64
-------------
se_data[0]: 1
se_data[3]: 4

 

2.自定义索引

# 自定义索引标签
se_data = pd.Series(a, index=['A', 'B', 'C', 'D'])
print(se_data)
print('-------------')
print('se_data[A]:', se_data['A'])
print('se_data[B]:', se_data['B'])

输出结果:

A    1
B    2
C    3
D    4
dtype: int64
-------------
se_data[A]: 1
se_data[B]: 2

 

3.字典创建 Series

# 字典创建实例
sites = {'a': "Google", 'b': "Baidu", 'c': "Sogou"}
se_data = pd.Series(sites, index=['a', 'b'])    # 字典内容可选
print(se_data)

输出结果:

a    Google
b     Baidu
dtype: object

 

4.Series 名称

sites = {'a': "Google", 'b': "Baidu", 'c': "Sogou"}
se_data = pd.Series(sites, name='Ang')
print(se_data)

输出结果:

a    Google
b     Baidu
c     Sogou
Name: Ang, dtype: object

 

二、数据结构 DataFrame

DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)

DataFrame 构造方法如下:

pandas.DataFrame( data, index, columns, dtype, copy)

参数说明:

  • data:一组数据(ndarray、series, map, lists, dict 等类型)

  • index:索引值,或者可以称为行标签

  • columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) 

  • dtype:数据类型

  • copy:拷贝数据,默认为 False

 

1.列表创建

data = [['Google', 10.], ['Baidu', 12.], ['Sogou', 13.]]

df = pd.DataFrame(data, columns=['Site', 'Age'])

print(df)

输出结果:

     Site   Age
0  Google  10.0
1   Baidu  12.0
2   Sogou  13.0

 

2.ndarrays 创建

data = {'Site': ['Google', 'Baidu', 'Sogou'], 'Age': [10, 12, 13]}

df = pd.DataFrame(data)

print(df)

 

3.字典创建

data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]

df = pd.DataFrame(data)

输出结果:

   a   b     c
0  1   2   NaN
1  5  10  20.0

没有对应的部分数据为 NaN

 

Pandas 可以使用 loc 属性返回指定行的数据,如果没有设置索引,第一行索引为 0,第二行索引为 1,以此类推:

data = {
  "calories": [420, 380, 390],
  "duration": [50, 40, 45]
}

# 数据载入到 DataFrame 对象
df = pd.DataFrame(data)

# 返回第一行
print(df.loc[0])
# 返回第二行
print(df.loc[1])

输出结果:

calories    420
duration     50
Name: 0, dtype: int64
calories    380
duration     40
Name: 1, dtype: int64

注意:返回结果其实就是一个 Pandas Series 数据。

 

也可以返回多行数据,使用 [[ ... ]] 格式,... 为各行的索引,以逗号隔开:

print(df.loc[[0, 1]])

注意:返回结果其实就是一个 Pandas DataFrame 数据

 

DataFrame同样可以指定索引值:

data = {
  "calories": [420, 380, 390],
  "duration": [50, 40, 45]
}

df = pd.DataFrame(data, index = ["day1", "day2", "day3"])

# 指定索引
print(df.loc["day2"])

 

三、CSV 文件

1.存储与读取

存储为 CSV

使用 to_csv() 方法将 DataFrame 存储为 csv 文件

data = {'Site': ['Google', 'Baidu', 'Sogou'], 'Age': [10, 12, 13]}

df = pd.DataFrame(data)

df.to_csv('csv\site.csv')

 

读取 CSV文件

df = pd.read_csv('site.csv')

print(df.to_string())

to_string() 用于返回 DataFrame 类型的数据,如果不使用该函数,则输出结果为数据的前面 5 行和末尾 5 行,中间部分以 ... 代替

 

2.数据处理

head()

head(n) 方法用于读取前面的 n 行,如果不填参数 n ,默认返回 5 行

print(df.head(10))

tail()

tail( n ) 方法用于读取尾部的 n 行,如果不填参数 n ,默认返回 5 行,空行各个字段的值返回 NaN

print(df.tail(10))

info()

info() 方法返回表格的一些基本信息

print(df.info())

输出结果:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 458 entries, 0 to 457          # 行数,458 行,第一行编号为 0
Data columns (total 9 columns):            # 列数,9列
 #   Column    Non-Null Count  Dtype       # 各列的数据类型
---  ------    --------------  -----  
 0   Name      457 non-null    object 
 1   Team      457 non-null    object 
 2   Number    457 non-null    float64
 3   Position  457 non-null    object 
 4   Age       457 non-null    float64
 5   Height    457 non-null    object 
 6   Weight    457 non-null    float64
 7   College   373 non-null    object       # non-null,意思为非空的数据    
 8   Salary    446 non-null    float64
dtypes: float64(4), object(5)               # 类型
memory usage: 32.3+ KB
None

 

四、JSON

JSON(JavaScript Object Notation,JavaScript 对象表示法),是存储和交换文本信息的语法,类似 XML。JSON 比 XML 更小、更快,更易解析

1.一般读取

同CSV的读取一样,JSON的存储读取也有read_json()方法,也可以直接处理 JSON 字符串:

data =[
    {
      "id": "A001",
      "name": "Baidu",
      "url": "www.baidu.com",
      "likes": 99
    },
    {
      "id": "A002",
      "name": "Google",
      "url": "www.google.com",
      "likes": 14
    },
    {
      "id": "A003",
      "name": "淘宝",
      "url": "www.taobao.com",
      "likes": 45
    }
]
df = pd.DataFrame(data)

print(df)

输出结果:

     id    name             url  likes
0  A001   Baidu   www.baidu.com     99
1  A002  Google  www.google.com     14
2  A003  Taobao  www.taobao.com     45

 

JSON 对象与 Python 字典具有相同的格式,所以也可以直接将 Python 字典转化为 DataFrame 数据:

# 字典格式的 JSON
s = {
    "col1":{"row1":1, "row2":2, "row3":3},
    "col2":{"row1":"x", "row2":"y", "row3":"z"}
}
# 读取 JSON 转为 DataFrame
df = pd.DataFrame(s)
print(df)

输出结果:

      col1 col2
row1     1    x
row2     2    y
row3     3    z

 

2.内嵌的 JSON

现给出文件内容:

{
    "school_name": "ABC primary school",
    "class": "Year 1",
    "students": [
    {
        "id": "A001",
        "name": "Tom",
        "math": 60,
        "physics": 66,
        "chemistry": 61
    },
    {
        "id": "A002",
        "name": "James",
        "math": 89,
        "physics": 76,
        "chemistry": 51
    },
    {
        "id": "A003",
        "name": "Jenny",
        "math": 79,
        "physics": 90,
        "chemistry": 78
    }]
}

 

解析出students:

# 使用 Python JSON 模块载入数据
with open('json_list.json','r') as f:
    data = json.loads(f.read())

# 展平数据
df_json_list = pd.json_normalize(data, record_path =['students'])
print(df_json_list)

输出结果:

   id   name  math  physics  chemistry
0  A001    Tom    60       66         61
1  A002  James    89       76         51
2  A003  Jenny    79       90         78

 

data = json.loads(f.read()) 使用 Python JSON 模块载入数据。

json_normalize() 使用了参数 record_path 并设置为 ['students'] 用于展开内嵌的 JSON 数据 students

显示结果还没有包含 school_name 和 class 元素,如果需要展示出来可以使用 meta 参数来显示这些元数据:

pd.json_normalize(
    data,
    record_path =['students'],
    meta=['school_name', 'class']
)

输出结果:

  id   name  math  physics  chemistry         school_name   class
0  A001    Tom    60       66         61  ABC primary school  Year 1
1  A002  James    89       76         51  ABC primary school  Year 1
2  A003  Jenny    79       90         78  ABC primary school  Year 1

 

读取更复杂的 JSON 数据,该数据嵌套了列表和字典:

{
    "school_name": "local primary school",
    "class": "Year 1",
    "info": {
      "president": "John Kasich",
      "address": "ABC road, London, UK",
      "contacts": {
        "email": "admin@e.com",
        "tel": "123456789"
      }
    },
    "students": [
    {
        "id": "A001",
        "name": "Tom",
        "math": 60,
        "physics": 66,
        "chemistry": 61
    },
    {
        "id": "A002",
        "name": "James",
        "math": 89,
        "physics": 76,
        "chemistry": 51
    },
    {
        "id": "A003",
        "name": "Jenny",
        "math": 79,
        "physics": 90,
        "chemistry": 78
    }]
}

 

文件转换为 DataFrame:

# 使用 Python JSON 模块载入数据
with open('json_mix.json','r') as f:
    data = json.loads(f.read())
   
df = pd.json_normalize(
    data,
    record_path =['students'],
    meta=[
        'class',
        ['info', 'president'],
        ['info', 'contacts', 'tel']
    ]
)

print(df)

输出结果:

id   name  math  physics  chemistry   class info.president info.contacts.tel
0  A001    Tom    60       66         61  Year 1    John Kasich         123456789
1  A002  James    89       76         51  Year 1    John Kasich         123456789
2  A003  Jenny    79       90         78  Year 1    John Kasich         123456789

 

3.内嵌数据中的一组

只读取内嵌中的 math 字段:

{
    "school_name": "local primary school",
    "class": "Year 1",
    "students": [
    {
        "id": "A001",
        "name": "Tom",
        "grade": {
            "math": 60,
            "physics": 66,
            "chemistry": 61
        }
 
    },
    {
        "id": "A002",
        "name": "James",
        "grade": {
            "math": 89,
            "physics": 76,
            "chemistry": 51
        }
    }]
}

 

需要使用到 glom 模块来处理数据套嵌,glom 模块允许我们使用 . 来访问内嵌对象的属性:

df = pd.read_json('json_deep.json')

data = df['students'].apply(lambda row: glom(row, 'grade.math'))
print(data)

输出结果:

0    60
1    89
2    79
Name: students, dtype: int64

 

五、数据清洗

 

数据清洗是对一些没有用的数据进行处理的过程

很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要对使数据分析更加准确,就需要对这些没有用的数据进行处理

1.清洗空值

删除包含空字段的行,可以使用 dropna() 方法,语法格式如下:

DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

参数说明:

  • axis:默认为 0,表示逢空值剔除整行,如果设置参数 axis=1 表示逢空值去掉整列。
  • how:默认为 'any' 如果一行(或一列)里任何一个数据有出现 NA 就去掉整行,如果设置 how='all' 一行(或列)都是 NA 才去掉这整行。
  • thresh:设置需要多少非空值的数据才可以保留下来的。
  • subset:设置想要检查的列。如果是多个列,可以使用列名的 list 作为参数。
  • inplace:如果设置 True,将计算得到的值直接覆盖之前的值并返回 None,修改的是源数据。

 

可以通过 isnull() 判断各个单元格是否为空:

df = pd.read_csv('property-data.csv')

print (df['NUM_BEDROOMS'])
print (df['NUM_BEDROOMS'].isnull())

 

Pandas 把 n/a 和 NA 当作空数据,na 不是空数据,不符合要求,可以指定空数据类型:

missing_values = ["n/a", "na", "--"]
df = pd.read_csv('property-data.csv', na_values = missing_values)

 

删除包含空数据的行:

df = df.dropna()
print(df.to_string())

注意:默认情况下,dropna() 方法返回一个新的 DataFrame,不会修改源数据

 

修改源数据 DataFrame, 可以使用 inplace = True 参数:

df.dropna(inplace = True)

print(df.to_string())

 

移除指定列有空值的行:

df.dropna(subset=['ST_NUM'], inplace = True)

print(df.to_string())

 

fillna() 方法来替换一些空字段:

df.fillna('空值', inplace = True)

print(df.to_string())

 

指定某一个列来替换数据:

df['PID'] = df['PID'].fillna('空值')

print(df.to_string())

 

替换空单元格的常用方法是计算列的均值、中位数值或众数

Pandas使用 mean()、median() 和 mode() 方法计算列的均值(所有值加起来的平均值)、中位数值(排序后排在中间的数)和众数(出现频率最高的数)

x = df["ST_NUM"].mean()
df["ST_NUM"].fillna(x, inplace = True)

x = df["ST_NUM"].median()
df["ST_NUM"].fillna(x, inplace = True)

x = df["ST_NUM"].mode()
df["ST_NUM"].fillna(x, inplace = True)

 

2.清洗格式错误数据

数据格式错误的单元格会使数据分析变得困难,甚至不可能

可以通过包含空单元格的行,或者将列中的所有单元格转换为相同格式的数据:

# 第三个日期格式错误
data = {
  "Date": ['2020/12/01', '2020/12/02' , '20201226'],
  "duration": [50, 40, 45]
}

df = pd.DataFrame(data, index = ["day1", "day2", "day3"])

df['Date'] = pd.to_datetime(df['Date'])

print(df.to_string())

输出结果:

 Date  duration
day1 2020-12-01        50
day2 2020-12-02        40
day3 2020-12-26        45

 

3.清洗错误数据

对错误的数据进行替换或移除:

person = {
  "name": ['Google', 'Runoob' , 'Taobao'],
  "age": [50, 40, 12345]    # 12345 年龄数据是错误的
}

df = pd.DataFrame(person)

df.loc[2, 'age'] = 30 # 修改数据

print(df.to_string())

 

也可以设置条件语句:

person = {
  "name": ['Google', 'Runoob' , 'Taobao'],
  "age": [50, 200, 12345]    
}

df = pd.DataFrame(person)

for x in df.index:
  if df.loc[x, "age"] > 120:
    df.loc[x, "age"] = 120

print(df.to_string())

 

也可以将错误数据的行删除:

person = {
  "name": ['Google', 'Runoob' , 'Taobao'],
  "age": [50, 40, 12345]    # 12345 年龄数据是错误的
}

df = pd.DataFrame(person)

for x in df.index:
  if df.loc[x, "age"] > 120:
    df.drop(x, inplace = True)

print(df.to_string())

 

4.清洗重复数据

如果要清洗重复数据,可以使用 duplicated() 和 drop_duplicates() 方法

如果对应的数据是重复的,duplicated() 会返回 True,否则返回 False:

person = {
  "name": ['Google', 'Runoob', 'Runoob', 'Taobao'],
  "age": [50, 40, 40, 23]  
}
df = pd.DataFrame(person)

print(df.duplicated())

输出结果:

0    False
1    False
2     True
3    False
dtype: bool

 

删除重复数据,可以直接使用drop_duplicates() 方法:

persons = {
  "name": ['Google', 'Runoob', 'Runoob', 'Taobao'],
  "age": [50, 40, 40, 23]  
}

df = pd.DataFrame(persons)

df.drop_duplicates(inplace = True)
print(df)

输出结果:

name  age
0  Google   50
1  Runoob   40
3  Taobao   23

 

标签:name,df,DataFrame,pd,print,data,Pandas
来源: https://www.cnblogs.com/ikunn/p/16558238.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有