2017-05-03 1 views
2

Je suis en train de construire un recommender en utilisant Pandas, et j'ai besoin de charger un gros fichier csv (avec quelque chose comme 10 millions d'enregistrements). Mon fichier d'entrée ressemble à ceci:Pandas read_csv dtype sauf l'index et les colonnes

P1 P2 ... k

un 1 1 ... 0

b 0 0 ... 0

c 0 0 ... 1

Avec k près de 400 colonnes.

j'essaie de lire mon dossier avec cet appel:

pd.read_csv(url,header=0, sep="\t",index_col=0,encoding="utf-8") 

Quand je lis le fichier, Pandas devine à tort que tous les chiffres dans mes données sont flotteurs. Je veux forcer les données à être dans le type int afin d'économiser beaucoup plus d'espace dans le processus de chargement. J'ai essayé d'utiliser l'option: dtype=int

mais cette erreur venu:

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

Je suppose que cela est dû au fait que mon index et les colonnes sont des chaînes.

Je sais que je pourrais essayer d'utiliser un dictionnaire pour spécifier les types de données pour les colonnes manuellement, mais depuis que je suis la construction d'un recommender ne connaissent pas les colonnes et les index de mes fichiers à l'avance, et je veux éviter de recréer le dictionnaire chaque fois qu'un nouveau fichier est hébergé.

Alors, comment puis-je spécifier à la méthode read_csv à définir le type entier uniquement sur les données de ma table, et non pour l'index et les noms de colonnes?

Répondre

0

Vous pouvez utiliser postulent pour travailler avec dataframe et définir une autre fonction pour revenir int si peut:

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) 

Si avoir anyfuther problème avec le type de données (qui est comme), s'il vous plaît poster ou me contacter par mail.

EDIT: Alors je pense que vous pourriez vérifier la première ligne de votre dataframe (ou n'importe quelle ligne que vous voulez) pour détecter quelles colonnes flottaient (étant donné que vous ne savez pas comment serait votre forme csv). Je possède ce dataframe:

|user_id |screen_name |isocode |location_name |location_prob 
0 |1058941868 |scottspur  |   |    | 
1 |1058941921 |Roxy22Bennett |   |    | 
2 |105894357 |MerrynPreece |GB   |United Kingdom |0.998043 

donc je dois vérifier la '2' ligne:

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) 

et le résultat serait:

Out[46]: [u'location_prob'] 

Vous pouvez alors créer un dict de les faire passer dans la fonction read_csv.

Nous vous souhaitons bonne chance.

+0

Je ne souhaite pas utiliser une fonction sur la datafrane chargée, en raison de l'utilisation de la mémoire.Je veux juste savoir s'il existe un moyen de configurer correctement la méthode read_csv pour définir le type de données correct, afin de gagner de l'espace mémoire. Dans votre solution, je chargerais l'ensemble de l'image comme float64, puis j'en créerais une copie en mémoire, ce qui n'est pas utile pour le moment. Merci quand même –

+0

J'édite pour une autre solution que je pense être possible –