Python 用pandas读写CSV文件的index和columns细节问题

目录

1、生成一个dataframe

2、写到csv文件

3、读取csv文件

4、pandas读取csv后转list


因为总是被Python读写csv时候的index和columns这几个问题搞混,每次都要百度,所以希望总结一下。总结完之后,发现明白了规律就不难记了。先说结论:

(1)对于Python程序来说,dataframe 这个类型的对象就是一个有行index和列name的数据结构

(2)基于第一点,在写数据的时候,dataframe是一个有index的对象,所以程序要做的是“设置一个参数来确定是否保存这个index到csv文件中”,因为默认的是对象带index,所以默认的是保存。

(3)也是基于第一点。对于Python程序来说,为了保证读取的数据能成为一个标准的dataframe对象,最保险的做法是不管数据中有没有index,先自动生成一个index。如果用户自己设置了一个index,那么就用用户设置的。所以在读csv文件时,要做的是是否设置index,因为这关系到程序用自然序列还是定好的index序列,不管是哪种,最后生成的dataframe都会有一个index。这一个想法也同样适用于用pd.Dataframe()生成一个dataframe的对象的时候。

(4)读和写的时候都可以选择某些列,而不是全部的列。

(5)还有一些其他的参数可以选择,可以直接看函数的接口。

 

1、生成一个dataframe

(1)自己不设置index,程序自动生成index

data = {'animal': ['cat', 'cat', 'snake', 'dog', 'dog', 'cat', 'snake', 'cat', 'dog', 'dog'],
        'age': [2.5, 3, 0.5, np.nan, 5, 2, 4.5, np.nan, 7, 3],
        'visits': [1, 3, 2, 3, 2, 3, 1, 1, 2, 1],
        'priority': ['yes', 'yes', 'no', 'yes', 'no', 'no', 'no', 'yes', 'no', 'no']}
df = pd.DataFrame(data)

结果:

(2)自己设置index

data = {'animal': ['cat', 'cat', 'snake', 'dog', 'dog', 'cat', 'snake', 'cat', 'dog', 'dog'],
        'age': [2.5, 3, 0.5, np.nan, 5, 2, 4.5, np.nan, 7, 3],
        'visits': [1, 3, 2, 3, 2, 3, 1, 1, 2, 1],
        'priority': ['yes', 'yes', 'no', 'yes', 'no', 'no', 'no', 'yes', 'no', 'no']}
label = ['a','b','c','d','e','f','g','h','i','j']
df = pd.DataFrame(data, index=label)
print(df)

结果:

2、写到csv文件

(1)此时也有两种情况,一种是将index也写入csv文件(Python默认的是这种方式),一种是不写入csv。

# 原始的index保存到csv文件
df.to_csv("test.csv")

# 原始的index不保存到csv
df.to_csv("test_1.csv", index=False)

            

(2)为了编码不出问题,也可以在写csv文件的时候就加上编码方式:

df.to_csv("test.csv", encoding="utf-8-sig")

(3)如果只想写dataframe的其中几列,那么可以用columns=[]这个参数来设置,如下所示:

df.to_csv("test.csv", encoding="utf-8-sig", columns=["animal", "age"])

3、读取csv文件

(1)pandas在读取csv文件时,不会去管原来的csv中是否存在index,而在于在读取的时候是否有设置index。如果读取的时候不设置index,那么系统会默认生成自然序列的index,如下所示:

df = pd.read_csv("test.csv")
print(df)

df1 = pd.read_csv("test_1.csv")
print(df1)

结果:

     

(2)如果读取时,给系统指定index,那么生成的dataframe的index就是是指定的,但是这里有个问题就是,这里指定的index只能是指定已经存在的列的序号或者列名,以读取test.csv这个文件所示:

df = pd.read_csv("test.csv", index_col=0)
print(df)

df1 = pd.read_csv("test_1.csv", index_col="age")
print(df1)

  

(3)只读取其中几列数据,如下所示:

df = pd.read_csv("test_1.csv", usecols=["animal", "age"])
print(df)

(4)读取csv文件关于列名的问题

        pandas读取csv文件时,默认第一行是列名,如果想要设置第一行不是列名,那么用下面的语句即可,dataframe会自动生成自然序列的列名:

data_df = pd.read_csv("test.csv", header=None, encoding="utf-8-sig")

        如果在读取csv文件时,文件中没有列名,想要自己添加,则可以用下面的语句,这个也适用于文件本身有列名,但是想重置列名的情况:

data_df = pd.read_csv("test.csv", names=["a", "b", "c", "d"], encoding="utf-8-sig")

4、pandas读取csv后转list

        主要代码如下:

import pandas as pd

data_df = pd.read_csv("test.csv", names=["a", "b", "c", "d"], encoding="utf-8-sig")
print(data_df)

data = data_df.values.tolist()
print(data)

结果:
   a  b   c    d
0  1  2   3  NaN
1  4  5   6  7.0
2  8  9  10  NaN
[[1.0, 2.0, 3.0, nan], [4.0, 5.0, 6.0, 7.0], [8.0, 9.0, 10.0, nan]]

 

文章中的dataframe的例子来自于:https://blog.csdn.net/weixin_42606990/article/details/104753519

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值