我有一个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
或者同样可以没有'X'列(因为该列是可选的):
A;B;C
a1;b1;c1
a2;b2;c2
a3;b3;c3
答案 0 :(得分:2)
您可以先使用contains
和boolean indexing
过滤replace
个值X
列:
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
答案 1 :(得分:1)
为什么不使用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)
答案 2 :(得分: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
答案 3 :(得分:0)
对于那些在标题中寻找问题答案的人,(在这种情况下,将所有设置为字符串,除了索引为 int)您可以执行以下操作,如果您知道您拥有的列数:< /p>
dtype = dict(zip(range(9),np.int16 + [str for _ in range(8)]))
dframe = pd.read_csv('../files/file.csv', dtype=dtype)