[英]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
過濾contains
值X
列,然后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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.