我尝试过使用下面这样的循环来进行某种程度的手动方法:
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:值的长度与索引长度不匹配
所以我的问题是:
split
应用于数据帧最后一列中的每个值的正确方法吗?关于#2 -我看到一些人使用applymap
,但我认为这会创建一个新的列,我只是想用另一个列表替换现有列中的值。
发布于 2016-07-24 20:58:30
我想你需要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的长度。
这是对数据帧最后一列中的每个值应用拆分的正确方法吗?
最好是使用字符串方法,参见熊猫文献。
发布于 2016-07-24 21:27:22
您没有正确地访问这些值。
要更正代码,最后一行应该是:
df.iat[idx, -1] = imageString.split(" ")
iat
用于标量获取和设置。
这可能是实现您的目标的更简单的方法:
df.iloc[:, -1] = df.iloc[:, -1].str.split()
https://stackoverflow.com/questions/38559967
复制相似问题