繁体   English   中英

Pandas read_csv dtype inference on file with many int columns,除了索引和列是字符串

[英]Pandas read_csv dtype inference on file with many int columns, except index and columns are string

我需要为我正在构建的推荐程序加载一个大的 .csv 文件(大约有 1000 万条记录)。 我的输入文件如下所示(k 接近 ~400 列):

      P1    P2    ... Pk

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错误地猜测我数据中的所有数字都是 floats 我想强制数据为“int”类型,以便在加载过程中节省内存。 我尝试使用选项: dtype=int ,但这发出了一个错误:

ValueError: invalid literal for int() with base 10: 'a'

我想这是因为我的索引和列是字符串。

我知道我可以尝试使用字典来手动指定列的数据类型,但是由于我正在构建一个推荐程序,因此我事先不知道我的文件的列和索引,我想避免重新 -每次加载新文件时创建字典。

如何指定read_csv方法仅在我的表数据上设置整数类型,而不是为索引和列名设置整数类型?

方法 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']

然后你可以创建它们的字典来传递 read_csv 函数。

方法 1:如果您只有几列具有非默认数据类型,则可以使用defaultdict

from collections import defaultdict
dtypes = defaultdict(lambda: int)
dtypes["index_column"] = str 
dtypes["other_special_column"] = object
# ...
df = pd.read_csv(path, dtype=dtypes, ...)

这是如何工作的: dtypes["something"]默认返回类型int ,除了事先指定的列。

方法 2:如果可以通过仅读取 .csv 的一部分来安全推断dtype ,您可以执行以下操作:

n = 1000
df = pd.read_csv(path, nrows=n, ...)
df = pd.read_csv(path, dtype=df.dtypes, ...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM