簡體   English   中英

使用 Pandas 讀取 CSV 時如何在列中保留前導零?

[英]How to keep leading zeros in a column when reading CSV with Pandas?

我正在使用read_csv將研究數據導入 Pandas 數據框。

我的主題代碼是 6 個數字編碼,其中包括出生日期。 對於我的一些科目,這會導致代碼帶有前導零(例如“010816”)。

當我導入 Pandas 時,前導零被去除,列被格式化為int64

有沒有辦法將這個列原封不動地導入為字符串?

我嘗試對列使用自定義轉換器,但它不起作用 - 似乎自定義轉換發生在 Pandas 轉換為 int 之前。

正如Lev Landau這個問題/答案中所指出的,可能有一個簡單的解決方案來為read_csv函數中的某個列使用converters選項。

converters={'column_name': lambda x: str(x)}

你可以在pandas.io.parsers.read_csv 文檔中參考read_csv函數的更多選項。

假設我有如下的 csv 文件projects.csv

project_name,project_id
Some Project,000245
Another Project,000478

例如下面的代碼正在修剪前導零:

import csv
from pandas import read_csv

dataframe = read_csv('projects.csv')
print dataframe

結果:

me@ubuntu:~$ python test_dataframe.py 
      project_name  project_id
0     Some Project         245
1  Another Project         478
me@ubuntu:~$

解決方案代碼示例:

import csv
from pandas import read_csv

dataframe = read_csv('projects.csv', converters={'project_id': lambda x: str(x)})
print dataframe

要求的結果:

me@ubuntu:~$ python test_dataframe.py 
      project_name project_id
0     Some Project     000245
1  Another Project     000478
me@ubuntu:~$

更新,因為它可以幫助其他人:

要將所有列都作為 str,可以這樣做(來自評論):

pd.read_csv('sample.csv', dtype = str)

要將大多數或選擇性列作為 str,可以這樣做:

# lst of column names which needs to be string
lst_str_cols = ['prefix', 'serial']
# use dictionary comprehension to make dict of dtypes
dict_dtypes = {x : 'str'  for x in lst_str_cols}
# use dict on dtypes
pd.read_csv('sample.csv', dtype=dict_dtypes)

這是一個更短、更強大且功能齊全的解決方案:

只需定義變量名稱和所需數據類型之間的映射(字典):

dtype_dic= {'subject_id': str, 
            'subject_number' : 'float'}

將該映射與pd.read_csv()

df = pd.read_csv(yourdata, dtype = dtype_dic)

等等!

如果您有很多列並且您不知道哪些列包含可能會遺漏的前導零,或者您可能只需要自動化您的代碼。 您可以執行以下操作:

df = pd.read_csv("your_file.csv", nrows=1) # Just take the first row to extract the columns' names
col_str_dic = {column:str for column in list(df)}
df = pd.read_csv("your_file.csv", dtype=col_str_dic) # Now you can read the compete file

你也可以這樣做:

df = pd.read_csv("your_file.csv", dtype=str)

通過這樣做,您會將所有列作為字符串,並且不會丟失任何前導零。

你可以做到這一點,適用於所有版本的 Pandas

pd.read_csv('filename.csv', dtype={'zero_column_name': object})

如果您知道寬度,您可以使用converters將數字轉換為固定寬度。

例如,如果寬度為 5,則

data = pd.read_csv('text.csv', converters={'column1': lambda x: f"{x:05}"})

這將解決問題。 它適用於 pandas==0.23.0 和read_excel

需要 Python3.6 或更高版本。

我認為您不能按照您想要的方式指定列類型(如果沒有及時更改並且 6 位數字不是您可以轉換為日期時間的日期)。 您可以嘗試使用np.genfromtxt()並從那里創建DataFrame

編輯:看看韋斯麥金尼的博客,可能有適合你的東西。 似乎在 11 月有一個來自pandas 0.10的新解析器。

例如,考慮以下 my_data.txt 文件: id,A 03,5 04,6 保留 id 列的前導零: df = pd.read_csv("my_data.txt", dtype={"id": "字符串"}) df

編號 A 0 03 5 1 04 6

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM