pandas读写csv文件和json文本及数据处理

一、读取CSV文件

import pandas as pd

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

print(df.to_string())

函数:read_csv(文件地址或根目录下名称)

 这里有个细节,df读出的内容是有中间省略的。因此有df.to_string()方法来转为DataFrame类型。

直接读取如下:

              Name            Team  Number Position   Age Height  Weight            College     Salary
0    Avery Bradley  Boston Celtics     0.0       PG  25.0    6-2   180.0              Texas  7730337.0
1      Jae Crowder  Boston Celtics    99.0       SF  25.0    6-6   235.0          Marquette  6796117.0
2     John Holland  Boston Celtics    30.0       SG  27.0    6-5   205.0  Boston University        NaN
3      R.J. Hunter  Boston Celtics    28.0       SG  22.0    6-5   185.0      Georgia State  1148640.0
4    Jonas Jerebko  Boston Celtics     8.0       PF  29.0   6-10   231.0                NaN  5000000.0
..             ...             ...     ...      ...   ...    ...     ...                ...        ...
453   Shelvin Mack       Utah Jazz     8.0       PG  26.0    6-3   203.0             Butler  2433333.0
454      Raul Neto       Utah Jazz    25.0       PG  24.0    6-1   179.0                NaN   900000.0
455   Tibor Pleiss       Utah Jazz    21.0        C  26.0    7-3   256.0                NaN  2900000.0
456    Jeff Withey       Utah Jazz    24.0        C  26.0    7-0   231.0             Kansas   947276.0
457            NaN             NaN     NaN      NaN   NaN    NaN     NaN                NaN        NaN

二、将DataFrame保存为csv

import pandas as pd
   
# 三个字段 name, site, age
nme = ["Google", "Runoob", "Taobao", "Wiki"]
st = ["www.google.com", "www.runoob.com", "www.taobao.com", "www.wikipedia.org"]
ag = [90, 40, 80, 98]
   
# 字典
dict = {'name': nme, 'site': st, 'age': ag}
     
df = pd.DataFrame(dict)
 
# 保存 dataframe
df.to_csv('site.csv')

方法:to_csv() ,参数为保存地址+名称,直接传名称则保存在当前根目录。

以上需要注意的是,to_csv()函数是被DataFrame对象调用的。

其次注意观察,dict数据结构的构成,它的value是调用来的,需要注意应用这种方式到项目。

三、pandas处理csv数据

head()方法,返回前n行数据。

入参:行数

默认不填时返回前五行

ps:这里要理解,pandas处理数据的方法,都是建立在读取或创建后的DataFrame之上的。

tail()方法,略。与上述类似,取尾部数据。

info()方法,取表格基本信息,包括:有多少行多少列,列名,字段类型,是否为空等。

四、pandas处理json数据

这里json格式可以用列表包字典来记忆,二者差别参见:

Python学习笔记——字典和JSON的区别_python字典与json的区别_JaneLeeee的博客-CSDN博客

读取json文本

import pandas as pd

df = pd.read_json('sites.json')
   
print(df.to_string())

方法read_json()

to_string() 用于返回 DataFrame 类型的数据,我们也可以直接处理 JSON 字符串

由于字典的数据结构和json可以视作一致,处理字典化的json时可以直接将其DataFrame再处理。

import pandas as pd


# 字典格式的 JSON                                                                                              
s = {
    "col1":{"row1":1,"row2":2,"row3":3},
    "col2":{"row1":"x","row2":"y","row3":"z"}
}

# 读取 JSON 转为 DataFrame                                                                                          
df = pd.DataFrame(s)
print(df)

除了从文件中读json和直接读字典化的json数据对象,read_json()还可以从URL中读取json数据。

import pandas as pd

URL = 'https://static.runoob.com/download/sites.json'
df = pd.read_json(URL)
print(df)

处理内嵌的 JSON 数据(复杂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
    }]
}

对于上述格式数据,字典的某个key对应的value又是一个json格式,直接用read_json()读取时如下:

          school_name   class                                           students
0  ABC primary school  Year 1  {'id': 'A001', 'name': 'Tom', 'math': 60, 'phy...
1  ABC primary school  Year 1  {'id': 'A002', 'name': 'James', 'math': 89, 'p...
2  ABC primary school  Year 1  {'id': 'A003', 'name': 'Jenny', 'math': 79, 'p...

那么如何把最内层的value里的json读出来呢。

首先应该从json文件里把data读取出来,然后再使用normalize()函数来将数据展平

import pandas as pd
import json

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

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

方法json.loads(),将读取到的json数据转化为json字典。

ps:插入小知识点

json.load()从json文件中读取数据

json.loads()将str类型的数据转换为dict类型

json.dumps()将dict类型的数据转成str

json.dump()将数据以json的数据类型写入文件中

方法json_normalize(),这里record_path很容易看出是复杂json的外层key。因此此方法将students对应的value,也就是内层json给读了出来作为DataFrame。

运行结果如下:

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

此时如果想要把外层key,value追加到一张表上,则可以给normalize()函数增加参数meta=['school_name', 'class']

如下:

import pandas as pd
import json

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

# 展平数据
df_nested_list = pd.json_normalize(
    data,
    record_path =['students'],
    meta=['school_name', 'class']
)
print(df_nested_list)

运行结果如下:

    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
{
    "school_name": "local primary school",
    "class": "Year 1",
    "info": {
      "president": "John Kasich",
      "address": "ABC road, London, UK",
      "contacts": {
        "email": "[email protected]",
        "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
    }]
}

对于以上json,你可以注意下面meta的使用层次。

import pandas as pd
import json

# 使用 Python JSON 模块载入数据
with open('nested_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

如果取复杂json内部的某个属性,比如下列math的value

{
    "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
        }
       
    },
    {
        "id": "A003",
        "name": "Jenny",
        "grade": {
            "math": 79,
            "physics": 90,
            "chemistry": 78
        }
    }]
}

这里用到glom模块

ps:glom模块的使用方法python数据解析模块之glom模块的使用(一)-WinFrom控件库|.net开源控件库|HZHControls官网

import pandas as pd
from glom import glom

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

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

仔细观察上述代码,df对象通过‘students’这一key值取到了对应的json结构。然后调用pandas的apply()方法,简单的应用apply(func()).

ps:pandas的apply()使用方法。python数据分析技巧篇-apply高级函数 - 知乎

Python apply函数_fcyh的博客-CSDN博客

以上代码中是入参了lambda生成的匿名函数。ps:python——lambda函数_python lambda函数_PL C的博客-CSDN博客

glom()的作用:从target目标里取出对应key的value,其中key为一段字符串,类似文件层级,以‘.’表示层级,直到对应的最内层的属性key。

你可能感兴趣的:(pandas,python,开发语言)