2016-07-25 83 views
1

我曾试图做使用循环就像下面有点手动方法:如何将函数应用于熊猫数据框中列中的每个值?

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: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],字符串的元素的长度短,因为所有的数据帧的长度。

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() 
相关问题