初始化

可以使用array+columns的格式,

d=pd.DataFrame(np.arange(10).reshape(2,5))
df1 = pd.DataFrame([['Snow','M',22],['Tyrion','M',32],['Sansa','F',18],['Arya','F',14]], columns=['name','gender','age'])

也可以使用字典+大括号的格式:

df = pd.DataFrame({'a': [1, 2] * 3,
...                    'b': [True, False] * 3,
...                    'c': [1.0, 2.0] * 3})

读csv文件

使用pandas读取csv文件;iloc查看并且修改指定位置的数值,但是不会改变原始的csv文件,重新读取,打印出来还是之前的数据。

csv文件可能有空值,有可能空值全部处于一部分,比如说文件前18行都是2列,但是之后18行是8列,这时读取文件就会报错,提示在18行到19行的地方expected 2 fileds pandas,解决方法是在read_csv参数中加入error_bad_lines=False,这样强制使其不会报错,但是结果是只读取到了前18行

可以先把之前的删除,再使用to_csv写入用来的路径

保存csv文件

保存时默认连同行列名也保存下来,可以使用header=False,index=False去除。如果连同行列名字保存下来,结果就是保存的csv文件会多出行列数。这时候再使用read_csv读取,并且header=0,使用第一行名作索引,就会在最左上角的地方出现Unnamed。这时候再保存,再读取,并且使用fscanf保存到数组中,就会出现全0的情况。

在read_csv时也有header,index_col.它们取0时是取第一行/列作为 索引。header=None和index_col=False等同,分别是对行列操作。

问题来了,如果header=0,选择第一行作为索引,那如果第一行有重复数字怎么办呢,可能导致几个列名是重复的。pandas的解决办法是对重复出现的数字增加小数点的部分进行编号。2222,就会编码为2.1,2.3,2.3,2.4作为索引。

data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
c = ['a', 'b', 'c']
r = ['A', 'B', 'C']
df = pd.DataFrame(data=data,  columns=c, index=r)

excel文件可以另存为csv格式,但是貌似会导致新生成的csv文件行数特别多,很多行是nan

切片

对列作切片。df["XXX"]可以得到指定的列名为XXX的列数据构成的series。[]中还可以是list类型。

根据列数据的属性作切片,df.select_dtype(exclude/include="object").colums

对列作删除。df.drop(["XXX"],axis=1),删除XXX列,注意轴方向要选取axis=1

drop(labels, axis=0, level=None, inplace=False, errors='raise'),默认按行删除

对行作切片。df.loc[[]],注意是两层中括号,否则得到的是列形式的series。中括号中是行索引。

重置索引

在数据清洗后,一些数据被清除:

df.drop(index=[0, 1])     ************>df.drop([0, 1])***************>df.drop([0, 1]axis=0)
df.drop(columns=['B', 'C'])***********df.drop(['B', 'C'], axis=1)

保留下的dataframe,其每一行的索引和之前一样,但是不同行之间的索引不再连续,这时用for循环按照行数遍历就会出问题。我们可以使用reset_index()重置索引。重置前后打印df会发现df多出一列名为“index”或者“level_0”的列,这是因为reset_index()默认将原有的索引值保存为新的一列。解决办法也很简单:

(df.reset_index(drop=True))

属性

df.shape,得到行数与列数

df.head(),得到dataframe的前五行

df.tail(),得到dataframe的后五行

df.head().append(df.tail()),将前后五行连接出来,打印出来可以观察数据

df.isnull().sum(),得到一个series,索引是列名,数据值是该列中空值的数目

pd.melt,pivot的逆操作,将列名视作数据。

通过列的属性选择df的子集

df.select_dtypes(include='bool')
df.select_dtypes(exclude=['int'])

返回的仍然是dataframe,再使用columns则可以得到筛选之后的列名组成,形式如

Index(['A', 'B', 'C'], dtype='object')

取values可以得到数组类型的列名,再取tolist可以得到list

dtype可以得到dataframe的字段类型,使用astype可以对其转换。

df['col2'] = df['col2'].astype('int')

取values之后其实就是ndarray类型的,这时如果想将dadaframe转置,可以利用array的转置T,然后列名和行名分别使用之前的行名和列名构建新的dataframe

df2 = pd.DataFrame(df.values.T, index=df.columns, columns=df.index)

改变整列数据

一般每一列代表一个特征,为了验证某一特征对最终结果的影响,需要对该列数据进行整体变换,可以使用map的方法:

df["feature1"]=df["feature1"].map(lambda x:x*2)

https://www.tuziang.com/combat/732.html

https://www.jianshu.com/p/6e35d37e7709