在Python 3.5中遇到了Pandas的问题
我使用Pandas读取本地csv,csv包含纯数据,不涉及头文件.然后我使用了分配列名
df= pd.read_csv(filePath, header=None)
df.columns=['XXX', 'XXX'] #for short, totally 11 cols
Run Code Online (Sandbox Code Playgroud)
csv有11列,其中一列是字符串,其他是整数.
然后我尝试在一个循环中逐个单元格地用整数值替换字符串列
for i, row in df.iterrows():
print(i, row['Name'])
df.set_value(i, 'Name', 123)
Run Code Online (Sandbox Code Playgroud)
intrger 123就是一个例子,并非这个列下的每个单元格都是123.如果我删除set_value,print函数效果很好,但是
df.set_value(i, 'Name', 123)
Run Code Online (Sandbox Code Playgroud)
然后错误信息:
回溯(最近一次调用最后一次):文件"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(项目,值)
文件"E:\ Users\XXX\Anaconda3\lib\site-packages\pandas\core\frame.py",第2334行,在_box_item_values中
return 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)
Run Code Online (Sandbox Code Playgroud)
有效.我想知道可能有什么我想念的?
谢谢!
小智 21
原始错误的原因:
Pandas DataFrame set_value(index,col,value)方法将返回发布的obscure AttributeError:当被修改的数据帧具有重复的列名时,'BlockManager'对象没有属性'T'.
可以使用@Windtalker上面的代码重现该错误,其中唯一的变化是列名称现在都是'x'而不是'x'和'y'.
import pandas as pd
df = pd.DataFrame(index=[0, 1, 2], columns=['x', 'x'])
df['x'] = 2
df['y'] = 'BBB'
print(df)
for i, row in df.iterrows():
df.set_value(i, 'y', 233)
print('\n')
print(df)
Run Code Online (Sandbox Code Playgroud)
希望这有助于其他人诊断同样的问题.
好吧,现在当你说得更清楚时,就更容易回答你的问题了......
假设你的 DF 看起来像这样:
In [164]: df
Out[164]:
a b c d e city
0 6 55 3 48 11 Kiev
1 5 29 42 95 69 Munich
2 53 79 60 80 89 Berlin
3 6 70 87 6 85 New York
4 97 23 94 43 31 Paris
5 15 17 56 34 77 Zaporizhzhia
6 28 35 58 82 33 Warsaw
7 41 93 60 54 21 Hurghada
8 68 23 80 39 66 Bern
9 15 17 30 26 98 Lviv
Run Code Online (Sandbox Code Playgroud)
并且您还有另一个带有城市 ID 的 DF:
In [165]: cities
Out[165]:
id
city
Warsaw 6
Kiev 0
New York 3
Hurghada 7
Munich 1
Paris 4
Berlin 2
Zaporizhzhia 5
Lviv 9
Bern 8
Run Code Online (Sandbox Code Playgroud)
您可以将城市映射到城市 ID,如下所示:
In [168]: df['city_id'] = df['city'].map(cities['id'])
In [169]: df
Out[169]:
a b c d e city city_id
0 6 55 3 48 11 Kiev 0
1 5 29 42 95 69 Munich 1
2 53 79 60 80 89 Berlin 2
3 6 70 87 6 85 New York 3
4 97 23 94 43 31 Paris 4
5 15 17 56 34 77 Zaporizhzhia 5
6 28 35 58 82 33 Warsaw 6
7 41 93 60 54 21 Hurghada 7
8 68 23 80 39 66 Bern 8
9 15 17 30 26 98 Lviv 9
Run Code Online (Sandbox Code Playgroud)
PS,当 95% 的情况下使用 Pandas 时,你实际上不需要循环 DF 来实现你的目标