其他分享
首页 > 其他分享> > Pandas

Pandas

作者:互联网

一、数据结构 Series

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

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

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

参数说明:

 

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)

参数说明:

 

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)

参数说明:

 

可以通过 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