2016-07-25 1 views
1

я попытался сделать несколько ручной подход, используя петлю, как показано ниже:Как применить функцию к каждому значению в столбце в кадре данных pandas?

data = pd.read_csv('data/training.csv') 
for idx,imageString in enumerate(data.iloc[:,-1]): 
    # print(imageString[0:10]) 
    data[idx,-1] = imageString.split(" ") 

Но это ошибки вне на последней строке с:

ValueError: Length of values does not match length of index

Так что мои вопросы:

  1. Может ли кто-нибудь объяснить, почему я получаю вышеуказанную ошибку и как я могу обойти это?
  2. Это правильный способ применить split к каждому значению в последнем столбце моего фрейма данных?

Что касается # 2 - я видел людей, используя applymap, но я думаю, что это создает новый столбец, я просто хочу, чтобы заменить значение в существующем столбце с другим списком.

+0

данных [data.columns [-1]] = data.iloc [: - 1] .map (лямбда-х: x.split ('')) – frist

ответ

2

Я думаю, что вам нужно str.split:

data = pd.read_csv('data/training.csv') 
data.iloc[:,-1] = data.iloc[:,-1].str.split(expand=False) 

Затем выберите первую или несколько другие элементы списков с str[1] или str[n]:

data.iloc[:,-1] = data.iloc[:,-1].str.split(expand=False).str[0] 
data.iloc[:,-1] = data.iloc[:,-1].str.split(expand=False).str[n] 

Пример:

import pandas as pd 

data = pd.DataFrame({'A':[1,2,3], 
        'B':[4,5,6], 
        'C':[7,8,9], 
        'D':[1,3,5], 
        'E':[5,3,6], 
        'F':['aa aa','ss uu','ee tt']}) 

print (data) 
    A B C D E  F 
0 1 4 7 1 5 aa aa 
1 2 5 8 3 3 ss uu 
2 3 6 9 5 6 ee tt 

print (data.iloc[:,-1].str.split(expand=False)) 
0 [aa, aa] 
1 [ss, uu] 
2 [ee, tt] 
Name: F, dtype: object 

data.iloc[:,-1] = data.iloc[:,-1].str.split(expand=False).str[0] 
print (data) 
    A B C D E F 
0 1 4 7 1 5 aa 
1 2 5 8 3 3 ss 
2 3 6 9 5 6 ee 

data.iloc[:,-1] = data.iloc[:,-1].str.split(expand=False).str[1] 
print (data) 
    A B C D E F 
0 1 4 7 1 5 aa 
1 2 5 8 3 3 uu 
2 3 6 9 5 6 tt 

Can anyone explain why I am getting the above error and how can I get around it?

Проблема imageString.split(" ") возвращение list и если назначить data[idx,-1], длина элементов строк меньше по длине всех DataFrame.

Is this the proper way to apply a split to every value in the last column of my data frame?

Лучше использовать методы строковых см pandas documentation.

0

Вы не видите изображения правильно.

Чтобы исправить код, последняя строка должна быть:

df.iat[idx, -1] = imageString.split(" ") 

iat используется для скалярного получения и установки.

Это, вероятно, более простой путь для достижения своей цели:

df.iloc[:, -1] = df.iloc[:, -1].str.split()