我需要为我正在构建的推荐人加载一个大的csv文件(包含1000万条记录)。 我的输入文件看起来像这样(k接近~400列):
P1 P2 ... k
a 1 1 ... 0
b 0 0 ... 0
c 0 0 ... 1
我尝试通过此调用阅读我的文件:
pd.read_csv(url,header=0, sep="\t",index_col=0,encoding="utf-8")
当我读取文件时,Pandas 错误地猜测我的数据中的所有数字都是浮点数。
我想强制数据为'int'类型,以便在加载过程中节省更多空间。
我尝试使用选项:dtype=int
但是出现了这个错误:
ValueError: invalid literal for int() with base 10: 'a'
我想这是因为我的索引和列是字符串。
我知道我可以尝试使用字典手动指定列的数据类型,但由于我正在构建推荐器事先不知道我的文件的列和索引 ,我想避免每次添加新文件时重新创建字典。
那么,如何指定read_csv
方法仅在我的表数据上设置整数类型,而不是索引和列名称?
答案 0 :(得分:0)
apply()
,如果可以的话,使用对int进行错误安全强制的函数:df = pd.read_csv(url,header=0, sep="\t",index_col=0,encoding="utf-8")
def check_to_int(x):
try:
return int(x)
except:
return x
for i in df.columns:
df[i] = df[i].apply(check_to_int)
如果数据类型有任何进一步的问题(就像),请发帖。
dtypes
创建一个dict名。例如,如果我有数据帧:
|user_id |screen_name |isocode |location_name |location_prob
0 |1058941868 |scottspur | | |
1 |1058941921 |Roxy22Bennett | | |
2 |105894357 |MerrynPreece |GB |United Kingdom |0.998043
所以我必须检查'2'行:
a = pd.read_csv('Result_Phong1.csv',header=0, encoding="utf-8", nrows = 3)
a.fillna('', inplace=True)
temp = []
for i in a.loc[2,:].index:
if type(a.loc[2,:][i]) == float:
temp.append(i)
,结果将是:
Out[46]: [u'location_prob']
然后你可以创建一个dict来传入read_csv函数。
答案 1 :(得分:0)
方法1::如果只有少数几列具有非默认数据类型,则可以使用defaultdict:
int
这是如何工作的:dtype
默认返回n = 1000
df = pd.read_csv(path, nrows=n, ...)
df = pd.read_csv(path, dtype=df.dtypes, ...)
类型,但预先指定的列除外。
方法2:如果仅通过读取.csv的一部分可以安全地推断出@if (...)
,则可以执行以下操作:
<?php if (...): ?>