如何将函数应用于pandas数据框中列中的每个值?

时间:2016-07-25 04:54:37

标签: python python-3.x 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:值的长度与索引的长度

不匹配

所以我的问题是:

  1. 任何人都可以解释为什么我会收到上述错误,我该怎么办? 绕过它?
  2. 这是将split应用于每个人的正确方法吗? 我的数据框的最后一列中的值?
  3. 关于#2 - 我看到有些人使用applymap,但我认为这会创建一个新列,我真的只想将现有列中的值替换为另一个列。

2 个答案:

答案 0 :(得分: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
  

任何人都可以解释为什么我会收到上述错误,我该怎么办呢?

问题是imageString.split(" ")返回list,如果分配给data[idx,-1],则字符串元素的长度会少于所有DataFrame的长度。

  

这是将分割应用于数据框最后一列中每个值的正确方法吗?

最好使用字符串方法,请参阅pandas documentation

答案 1 :(得分:0)

您没有正确访问这些值。

要更正您的代码,最后一行应为:

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

iat用于标量获取和设置。

这可能是实现目标的更简单方法:

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