2017-01-27 4 views
2

Я работаю с набором данных iris.scale для целей анализа. Но в процессе обработки, как я могу получить нарезанное значение столбцов, как после чтения файла данных,Получить нарезанные значения столбцов

df = pd.read_csv("../Data/iris.scale.csv", sep=' ', header=None, names=['class','S.lenght','S.width','P.lenght','P.width']) 
print(df.head(3)) 

    class  S.lenght  S.width  P.lenght  P.width 
    1  1:-0.555556 2:0.25  3:-0.864407  4:-0.916667 
    1  1:-0.666667 2:-0.166667 3:-0.864407  4:-0.916667 
    1  1:-0.833333 2:-0.08333 3:-0.830508  4:-0.916667 

Но как получить эти отрезанные колонны, как этот, без каких-либо художественных цитат, так что он может быть обработан

class  S.lenght  S.width  P.lenght  P.width 
    1  -0.555556 0.25  -0.864407  -0.916667 
    1  -0.666667 -0.166667 -0.864407  -0.916667 
    1  -0.833333 -0.08333 -0.830508  -0.916667 
+0

Насколько велик '' '' iris.scale.csv'''? Вы добавили бы несколько строк файла csv? – wwii

+0

его очень маленький набор данных, обычно очень хороший для тестирования постели https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass/iris.scale –

ответ

1

Вы можете использовать set_index для создания DataFrame со значениями только с : которые добытых split, последний выход произнесения к float:

df=df.set_index('class').apply(lambda x: x.str.split(':').str[1]).astype(float).reset_index() 
print (df) 
    class S.lenght S.width P.lenght P.width 
0  1 -0.555556 0.250000 -0.864407 -0.916667 
1  1 -0.666667 -0.166667 -0.864407 -0.916667 
2  1 -0.833333 -0.083330 -0.830508 -0.916667 

Другое решение с str.extract:

df = df.set_index('class').apply(lambda x: x.str.extract(':(.*)', expand=False)).astype(float).reset_index() 
print (df) 
    class S.lenght S.width P.lenght P.width 
0  1 -0.555556 0.250000 -0.864407 -0.916667 
1  1 -0.666667 -0.166667 -0.864407 -0.916667 
2  1 -0.833333 -0.083330 -0.830508 -0.916667 
1

pandas

  • filter сосредоточиться на правильных столбцах
  • stack + str.split + unstack
  • update

код

df.update(
    df.filter(regex='S|P').stack().str.split(':').str[1].astype(float).unstack()) 
df 

    class S.lenght S.width P.lenght P.width 
0  1 -0.555556  0.25 -0.864407 -0.916667 
1  1 -0.666667 -0.166667 -0.864407 -0.916667 
2  1 -0.833333 -0.08333 -0.830508 -0.916667 

numpy

  • split весь массив сразу
  • построить новый массив
  • ломтика и назначить

код

s = np.core.defchararray.split(df.values[:, 1:].astype(str), ':').tolist() 
df.iloc[:, 1:] = np.array(s)[:, :, 1].astype(float) 

    class S.lenght S.width P.lenght P.width 
0  1 -0.555556  0.25 -0.864407 -0.916667 
1  1 -0.666667 -0.166667 -0.864407 -0.916667 
2  1 -0.833333 -0.08333 -0.830508 -0.916667 
0

Предварительная обработка данных перед подачей его на панд, чтобы удалить избыток

import re, io 
with open("../Data/iris.scale.csv") as f: 
    data = f.read() 

p = r'[1-4]:' 
data = re.sub(p, '', data) 

После этого вы можете либо записать данные в новый файл перед его подачей к Pandas или поместите его в файл-подобный объект, а затем подайте его в Pandas.

#Python 2.7 
data = io.BytesIO(data) 
#Python 3x 
#data = io.StringIO(data) 
df = pd.read_csv(data, delim_whitespace = True, index_col = False, names=['class','S.lenght','S.width','P.lenght','P.width']) 
Смежные вопросы