在Python 3.5中遇到了Pandas的问题
我使用Pandas读取本地csv,csv包含纯数据,不涉及头文件 . 然后我使用了分配列名
df= pd.read_csv(filePath, header=None)
df.columns=['XXX', 'XXX'] #for short, totally 11 cols
csv有11列,其中一列是字符串,其他是整数 .
然后我尝试在一个循环中逐个单元格地用整数值替换字符串列
for i, row in df.iterrows():
print(i, row['Name'])
df.set_value(i, 'Name', 123)
intrger 123就是一个例子,并非这个列下的每个单元格都是123.如果我删除set_value,print函数效果很好,但是
df.set_value(i, 'Name', 123)
然后错误信息:
回溯(最近一次调用最后一次):文件“D:/xxx/test.py”,第20行,在df.set_value(i,'Name',233)文件“E:\ Users \ XXX \ Anaconda3 \ lib \ site-packages \ pandas \ core \ frame.py“,第1862行,在set_value series = self._get_item_cache(col)文件”E:\ Users \ XXX \ Anaconda3 \ lib \ site-packages \ pandas \ core \ generic.py “,第1351行,_get_item_cache res = self._box_item_values(item,values)文件”E:\ Users \ XXX \ Anaconda3 \ lib \ site-packages \ pandas \ core \ frame.py“,第2334行,在_box_item_values中返回self ._constructor(values.T,columns = items,index = self.index)AttributeError:'BlockManager'对象没有属性'T'
但是,如果我在代码中手动创建一个数据帧
df = pd.DataFrame(index=[0, 1, 2], columns=['x', 'y'])
df['x'] = 2
df['y'] = 'BBB'
print(df)
for i, row in df.iterrows():
df.set_value(i, 'y', 233)
print('\n')
print(df)
有效 . 我想知道可能有些东西我不见了?
谢谢!
2 回答
原始错误的原因:
Pandas DataFrame set_value(index,col,value)方法将返回发布的obscure AttributeError:当被修改的数据帧具有重复的列名时,'BlockManager'对象没有属性'T' .
可以使用@Windtalker上面的代码重现该错误,其中唯一的变化是列名称现在都是'x'而不是'x'和'y' .
希望这有助于其他人诊断同样的问题 .
好吧,现在当你把它弄得更清楚时,回答你的问题会更容易......
假设您的DF看起来像这样:
并且你有另一个带有city-id的DF:
你可以像这样将city映射到city-id:
PS在使用95%的Pandas时,你并不需要循环使用DF来实现目标