簡體   English   中英

Pandas read_csv dtype 指定除一列之外的所有列

[英]Pandas read_csv dtype specify all columns but one

我有一個 CSV 文件。 我想將其中的大部分值讀為字符串,但是如果具有給定標題的列存在,我想將列讀為 bool。

因為 CSV 文件有很多列,我不想在每一列上直接指定數據類型並給出如下內容:

data = read_csv('sample.csv', dtype={'A': str, 'B': str, ..., 'X': bool})

是否可以在每一列上定義字符串類型,但同時將可選列作為 bool 讀取?

我目前的解決方案如下(但它非常低效且緩慢):

data = read_csv('sample.csv', dtype=str) # reads all column as string
if 'X' in data.columns:
    l = lambda row: True if row['X'] == 'True' else False if row['X'] == 'False' else None
    data['X'] = data.apply(l, axis=1)

更新:示例 CSV:

A;B;C;X
a1;b1;c1;True
a2;b2;c2;False
a3;b3;c3;True

或者同樣可以 ba 沒有 'X' 列(因為該列是可選的):

A;B;C
a1;b1;c1
a2;b2;c2
a3;b3;c3

您可以先使用boolean indexing過濾containsX列,然后replace

cols = df.columns[df.columns.str.contains('X')]
df[cols] = df[cols].replace({'True': True, 'False': False})

或者如果需要過濾列X

cols = df.columns[df.columns == 'X']
df[cols] = df[cols].replace({'True': True, 'False': False})

樣品:

import pandas as pd

df = pd.DataFrame({'A':['a1','a2','a3'],
                   'B':['b1','b2','b3'],
                   'C':['c1','c2','c3'],
                   'X':['True','False','True']})

print (df)
    A   B   C      X
0  a1  b1  c1   True
1  a2  b2  c2  False
2  a3  b3  c3   True
print (df.dtypes)
A    object
B    object
C    object
X    object
dtype: object

cols = df.columns[df.columns.str.contains('X')]
print (cols)

Index(['X'], dtype='object')

df[cols] = df[cols].replace({'True': True, 'False': False})

print (df.dtypes)
A    object
B    object
C    object
X      bool
dtype: object
print (df)

    A   B   C      X
0  a1  b1  c1   True
1  a2  b2  c2  False
2  a3  b3  c3   True

為什么不使用bool()數據類型。 如果傳遞參數且參數不是False,None,''或0,則bool()計算結果為true

if 'X' in data.columns:
    try:
        l = bool(data.columns['X'].replace('False', 0))
    except:
        l = None
    data['X'] = data.apply(l, axis=1)

實際上,當您從pandas使用read_csv(在版本0.17上測試)時,您不需要任何特殊處理。 將您的示例文件與X一起使用:

import pandas as pd

df = pd.read_csv("file.csv", delimiter=";")
print(df.dtypes)

A    object
B    object
C    object
X      bool
dtype: object

對於那些在標題中尋找問題答案的人(在這種情況下,將所有設置為字符串,除了索引為 int)您可以執行以下操作,如果您知道您擁有的列數:

dtype = dict(zip(range(9),np.int16 + [str for _ in range(8)]))
dframe = pd.read_csv('../files/file.csv', dtype=dtype)

在這個問題中歸功於 Anton vBR

暫無
暫無

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

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