J'importe un fichier texte avec 5 colonnes de données (de différents types de données). Pour une raison quelconque, une fois les données importées et nettoyées. Ils sont tous affectés de type Objet dans les pandas, il n'y a donc aucun moyen de distinguer les colonnes.

Mon objectif est de distinguer les colonnes par type de données et de supprimer les colonnes qui contiennent un type de données spécifique. Le code et les résultats sont les suivants:

import pandas as pd
import re

data = pd.read_csv('SevAvail2.txt', sep="\t", header=None)
df = pd.DataFrame(data)


header = df.column = df.iloc[0]
header = df.reindex(df.index.drop(0))

# print(header)
df = header
df = df.loc[:, df.isnull().mean() < .95]

#count remaining column length and print list with count
col_length = len(df.columns)
print(col_length)
header_label = []
for i in range(0, col_length):
    header_label.append(i)

#reset headers to (0 : n)
df.columns = header_label

# print(df)
for column in df.columns[0:]:
    print(df[column])

Colonnes résultantes:

1     AB21313BF
2     AB21313GF
3     AB21313SF
4     AB21313CF
5     AB21313KF
Name: 0, dtype: object

1          BABA TECH
2              LALA TECH
3              NDMP
4          IND CORP
5          CAMP 
Name: 1, dtype: object

1       9.2500
2      15.7500
3       7.0000
4      19.7500
5      33.5000
Name: 2, dtype: object

1         -65
2        1.75
3           0
4          -4
5        .75)
Name: 3, dtype: object

1      4,501,561.00 
2      3,145,531.00 
3      1,454,303.00 
4      1,420,949.00 
5      1,095,575.00 
Name: 4, dtype: object
0
ravecoder 14 mars 2019 à 22:41

2 réponses

Meilleure réponse

Vous pouvez utiliser l'API pandas infer_dtype pour déduire le type de données des colonnes.

Exemple:

import pandas as pd
df = pd.DataFrame({'c1': [1,2], 'c2': [1.0,2.0], 'c3': ["a","b"]})
for c in df.columns:
    print (pd.lib.infer_dtype(df[c]))

Production:

integer floating string

Documentation : https://pandas. pydata.org/pandas-docs/stable/reference/api/pandas.api.types.infer_dtype.html

Nombres stockés sous forme de chaînes :

Lorsqu'un nombre contient "," et stocké sous forme de chaîne (ex:'4,501,561.00'), un moyen de force brute est

import pandas as pd
df = pd.DataFrame({'c1': ['4,501,561.00','501,561.00'], 'c2': [1.0,2.0], 'c3': ["a","b"]})
for c in df.columns:
    if pd.lib.infer_dtype(df[c]) == 'string':
        # Or is it a number stored as string 
        try:
            df[c].str.replace(',','').astype(float)
            print ("floating")
        except:
            print ("string")
    else:
        print (pd.lib.infer_dtype(df[c]))
0
mujjiga 14 mars 2019 à 20:42

S'il doit s'agir d'un nombre et que python reconnaît comme objet, cela signifie qu'il y a des caractères non numériques dans le champ. Vous pouvez consulter le fichier source manuellement ou forcer les colonnes qui, selon vous, doivent être numériques en tant que telles. Alternativement, vous pouvez forcer le type de données à l'importation en les affectant dans votre instruction de lecture

pr.read_csv('filename', sep='/t', dtype= {'Field1':int, 'Field2':str... }

Etc...

0
Erick 3E 14 mars 2019 à 20:14