dataframe常用操作总结
初始化
可以使用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
總結
以上是生活随笔為你收集整理的dataframe常用操作总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PCA对特征点描述子降维
- 下一篇: 吴恩达作业11:残差网络实现手势数字的识