Pandas read_csv dtype对包含许多int列的文件进行推理,但索引和列除外是字符串

时间:2017-05-03 13:30:22

标签: python pandas csv types type-inference

我需要为我正在构建的推荐人加载一个大的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方法仅在我的表数据上设置整数类型,而不是索引和列名称?

2 个答案:

答案 0 :(得分:0)

方法1)在数据框上使用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)

如果数据类型有任何进一步的问题(就像),请发帖。

方法2)动态读取数据帧的标题行以检测哪些列是int / float(假设你不知道你的csv列名),然后为那些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 (...): ?>