pandas object转float_25个Pandas实用技巧
輸入下面的命令查詢pandas版本:
In?[7]:pd.__version__Out[7]:'0.24.2'如果你還想知道pandas所依賴的模塊的版本,你可以使用show_versions()函數:
In [9]:pd.show_versions()INSTALLED VERSIONS ------------------ commit: None python: 3.7.3.final.0 python-bits: 64 OS: Darwin OS-release: 18.6.0 machine: x86_64 processor: i386 byteorder: little LC_ALL: None LANG: en_US.UTF-8 LOCALE: en_US.UTF-8 pandas: 0.24.2 pytest: None pip: 19.1.1 setuptools: 41.0.1 Cython: None numpy: 1.16.4 scipy: None pyarrow: None xarray: None IPython: 7.5.0 sphinx: None patsy: None dateutil: 2.8.0 pytz: 2019.1 blosc: None bottleneck: None tables: None numexpr: None feather: None matplotlib: 3.1.0 openpyxl: None xlrd: None xlwt: None xlsxwriter: None lxml.etree: None bs4: None html5lib: None sqlalchemy: None pymysql: None psycopg2: None jinja2: 2.10.1 s3fs: None fastparquet: None pandas_gbq: None pandas_datareader: None gcsfs: None你可以查看到Python,pandas, Numpy, matplotlib等的版本信息。
創建示例DataFrame假設你需要創建一個示例DataFrame。有很多種實現的途徑,我最喜歡的方式是傳一個字典給DataFrame constructor,其中字典中的keys為列名,values為列的取值。
現在如果你需要創建一個更大的DataFrame,上述方法則需要太多的輸入。在這種情況下,你可以使用Numpy的random.rand()函數,告訴它行數和列數,將它傳遞給DataFrame constructor:
這種方式很好,但如果你還想把列名變為非數值型的,你可以強制地將一串字符賦值給columns參數:
你可以想到,你傳遞的字符串的長度必須與列數相同。
更改列名讓我們來看一下剛才我們創建的示例DataFrame:
我更喜歡在選取pandas列的時候使用點(.),但是這對那么列名中含有空格的列不會生效。讓我們來修復這個問題。
更改列名最靈活的方式是使用rename()函數。你可以傳遞一個字典,其中keys為原列名,values為新列名,還可以指定axis:
使用這個函數最好的方式是你需要更改任意數量的列名,不管是一列或者全部的列。
如果你需要一次性重新命令所有的列名,更簡單的方式就是重寫DataFrame的columns屬性:
如果你需要做的僅僅是將空格換成下劃線,那么更好的辦法是使用str.replace()方法,這是因為你都不需要輸入所有的列名:
In?[16]:df.columns?=?df.columns.str.replace('?',?'_')上述三個函數的結果都一樣,可以更改列名使得列名中不含有空格:
最后,如果你需要在列名中添加前綴或者后綴,你可以使用add_prefix()函數:
或者使用add_suffix()函數:
行序反轉讓我們來看一下drinks這個DataFame:
In [20]:drinks.head()Out[20]:| Afghanistan | 0 | 0 | 0 | 0.0 | Asia |
| Albania | 89 | 132 | 54 | 4.9 | Europe |
| Algeria | 25 | 0 | 14 | 0.7 | Africa |
| Andorra | 245 | 138 | 312 | 12.4 | Europe |
| Angola | 217 | 57 | 45 | 5.9 | Africa |
該數據集描述了每個國家的平均酒消費量。如果你想要將行序反轉呢?
最直接的辦法是使用loc函數并傳遞::-1,跟Python中列表反轉時使用的切片符號一致:
In [21]:drinks.loc[::-1].head()Out[21]:| Zimbabwe | 64 | 18 | 4 | 4.7 | Africa |
| Zambia | 32 | 19 | 4 | 2.5 | Africa |
| Yemen | 6 | 0 | 0 | 0.1 | Asia |
| Vietnam | 111 | 2 | 1 | 2.0 | Asia |
| Venezuela | 333 | 100 | 3 | 7.7 | South America |
如果你還想重置索引使得它從0開始呢?
你可以使用reset_index()函數,告訴他去掉完全拋棄之前的索引:
| Zimbabwe | 64 | 18 | 4 | 4.7 | Africa |
| Zambia | 32 | 19 | 4 | 2.5 | Africa |
| Yemen | 6 | 0 | 0 | 0.1 | Asia |
| Vietnam | 111 | 2 | 1 | 2.0 | Asia |
| Venezuela | 333 | 100 | 3 | 7.7 | South America |
你可以看到,行序已經反轉,索引也被重置為默認的整數序號。
列序反轉跟之前的技巧一樣,你也可以使用loc函數將列從左至右反轉:
In?[23]:drinks.loc[:, ::-1].head()Out[23]:| Asia | 0.0 | 0 | 0 | 0 | Afghanistan |
| Europe | 4.9 | 54 | 132 | 89 | Albania |
| Africa | 0.7 | 14 | 0 | 25 | Algeria |
| Europe | 12.4 | 312 | 138 | 245 | Andorra |
| Africa | 5.9 | 45 | 57 | 217 | Angola |
逗號之前的冒號表示選擇所有行,逗號之后的::-1表示反轉所有的列,這就是為什么country這一列現在在最右邊。
通過數據類型選擇列這里有drinks這個DataFrame的數據類型:
In [24]:drinks.dtypesOut[24]:country objectbeer_servings int64spirit_servings int64wine_servings int64total_litres_of_pure_alcohol float64continent objectdtype: object假設你僅僅需要選取數值型的列,那么你可以使用select_dtypes()函數:
In [25]:drinks.select_dtypes(include='number').head()Out[25]:?| 0 | 0 | 0 | 0.0 |
| 89 | 132 | 54 | 4.9 |
| 25 | 0 | 14 | 0.7 |
| 245 | 138 | 312 | 12.4 |
| 217 | 57 | 45 | 5.9 |
這包含了int和float型的列。
你也可以使用這個函數來選取數據類型為object的列:
你還可以選取多種數據類型,只需要傳遞一個列表即可:
你還可以用來排除特定的數據類型:
將字符型轉換為數值型讓我們來創建另一個示例DataFrame:
這些數字實際上儲存為字符型,導致其數據類型為object:
為了對這些列進行數學運算,我們需要將數據類型轉換成數值型。你可以對前兩列使用astype()函數:
但是,如果你對第三列也使用這個函數,將會引起錯誤,這是因為這一列包含了破折號(用來表示0)但是pandas并不知道如何處理它。
你可以對第三列使用to_numeric()函數,告訴其將任何無效數據轉換為NaN:
如果你知道NaN值代表0,那么你可以fillna()函數將他們替換成0:
最后,你可以通過apply()函數一次性對整個DataFrame使用這個函數:
僅需一行代碼就完成了我們的目標,因為現在所有的數據類型都轉換成float:
減小DataFrame空間大小pandas DataFrame被設計成可以適應內存,所以有些時候你可以減小DataFrame的空間大小,讓它在你的系統上更好地運行起來。
這是drinks這個DataFrame所占用的空間大小:
可以看到它使用了30.4KB。
如果你對你的DataFrame有操作方面的問題,或者你不能將它讀進內存,那么在讀取文件的過程中有兩個步驟可以使用來減小DataFrame的空間大小。
第一個步驟是只讀取那些你實際上需要用到的列,可以調用usecols參數:
通過僅讀取用到的兩列,我們將DataFrame的空間大小縮小至13.6KB。
第二步是將所有實際上為類別變量的object列轉換成類別變量,可以調用dtypes參數:
通過將continent列讀取為category數據類型,我們進一步地把DataFrame的空間大小縮小至2.3KB。
值得注意的是,如果跟行數相比,category數據類型的列數相對較小,那么catefory數據類型可以減小內存占用。
假設你的數據集分化為多個文件,但是你需要將這些數據集讀到一個DataFrame中。
舉例來說,我有一些關于股票的小數聚集,每個數據集為單天的CSV文件。這是第一天的:
這是第二天的:
這是第三天的:
你可以將每個CSV文件讀取成DataFrame,將它們結合起來,然后再刪除原來的DataFrame,但是這樣會多占用內存且需要許多代碼
更好的方式為使用內置的glob模塊。你可以給glob()函數傳遞某種模式,包括未知字符,這樣它會返回符合該某事的文件列表。在這種方式下,glob會查找所有以stocks開頭的CSV文件:
glob會返回任意排序的文件名,這就是我們為什么要用Python內置的sorted()函數來對列表進行排序。
我們以生成器表達式用read_csv()函數來讀取每個文件,并將結果傳遞給concat()函數,這會將單個的DataFrame按行來組合:
不幸的是,索引值存在重復。為了避免這種情況,我們需要告訴concat()函數來忽略索引,使用默認的整數索引:
按列從多個文件中構建DataFrame上一個技巧對于數據集中每個文件包含行記錄很有用。但是如果數據集中的每個文件包含的列信息呢?
這里有一個例子,dinks數據集被劃分成兩個CSV文件,每個文件包含三列:
同上一個技巧一樣,我們以使用glob()函數開始。這一次,我們需要告訴concat()函數按列來組合:
現在我們的DataFrame已經有六列了。
End.
譯者:山陰少年
來源:博客園
原文鏈接:https://nbviewer.jupyter.org/github/justmarkham/pandas-videos/blob/master/top_25_pandas_tricks.ipynb
本文為轉載,如有侵權請聯系后臺刪除
好文章,我在看??總結
以上是生活随笔為你收集整理的pandas object转float_25个Pandas实用技巧的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 制作多系统启动盘教程_制作U盘启动盘教程
- 下一篇: Hive关于数据库的增删改查