2016-06-15 1 views
2

La question est probaly extrêmement stupide, mais je me suis blessé mon cerveau de déterminer ce qu'il faut fairePandas et dataframe to_numeric: colonne de sélection par index

Il y a un pd.dataframe avec N colonnes. Je dois sélectionner des colonnes, se référant par index d'une colonne, puis de convertir toutes les valeurs numériques et réécrire cette colonne dans mon dataframe

Je l'ai fait par référence nom de la colonne (comme df['a'] = pd.to_numeric(df['a']) mais coincé avec des indices (comme df[1] = pd.to_numeric(df[1])

Quelle est la bonne façon dans cette situation à dataframe référence colonne (python 2.7)

Répondre

3

Vous pouvez utiliser ix pour les colonnes en sélectionnant puis applyto_numeric:

import pandas as pd 

df = pd.DataFrame({1:['1','2','3'], 
        2:[4,5,6], 
        3:[7,8,9], 
        4:['1','3','5'], 
        5:[5,3,6], 
        6:['7','4','3']}) 

print (df) 
    1 2 3 4 5 6 
0 1 4 7 1 5 7 
1 2 5 8 3 3 4 
2 3 6 9 5 6 3 

print (df.dtypes) 
1 object 
2  int64 
3  int64 
4 object 
5  int64 
6 object 
dtype: object 

print (df.columns) 
Int64Index([1, 2, 3, 4, 5, 6], dtype='int64') 
cols = [1,4,6]  
df.ix[:, cols] = df.ix[:, cols].apply(pd.to_numeric) 

print (df) 
    1 2 3 4 5 6 
0 1 4 7 1 5 7 
1 2 5 8 3 3 4 
2 3 6 9 5 6 3 

print (df.dtypes) 
1 int64 
2 int64 
3 int64 
4 int64 
5 int64 
6 int64 
dtype: object 

Si des colonnes sont strings, pas int (mais il semble que int) ajouter '' aux nombres dans listcols:

import pandas as pd 

df = pd.DataFrame({'1':['1','2','3'], 
        '2':[4,5,6], 
        '3':[7,8,9], 
        '4':['1','3','5'], 
        '5':[5,3,6], 
        '6':['7','4','3']}) 

#print (df) 

#print (df.dtypes) 

print (df.columns) 
Index(['1', '2', '3', '4', '5', '6'], dtype='object') 

#add `''` 
cols = ['1','4','6'] 
#1. ix: supports mixed integer and label based access  
df.ix[:, cols] = df.ix[:, cols].apply(pd.to_numeric) 

#2. loc: only label based access 
# df.loc[:, cols] = df.loc[:, cols].apply(pd.to_numeric) 

#3. iloc: for index based access 
# cols = [i for i in range(len(df.columns))] 
# df.iloc[:, cols].apply(pd.to_numeric) 

print (df) 
    1 2 3 4 5 6 
0 1 4 7 1 5 7 
1 2 5 8 3 3 4 
2 3 6 9 5 6 3 

print (df.dtypes) 
1 int64 
2 int64 
3 int64 
4 int64 
5 int64 
6 int64 
dtype: object 
+0

Merci, ça a l'air bien. Mais existe-t-il un moyen de référencer la colonne avec l'en-tête non-int avec int? Je veux dire, en référence à la 6ème colonne dans 'Index (['1', '2', '3', '4', '5', 'k'], dtype = 'objet')' avec 'cols = [6] '? –

+0

Oui, vous pouvez utiliser ['iloc'] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.iloc.html) - donc 6. colonnes est' df.iloc [: , 5] '(nombre de pythons à partir de 0) – jezrael

+0

J'ai bien travaillé, merci! –