目录
因为总是被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