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”,line 1862年,在set_value中 series = self._get_item_cache(col)
文件 “E:\用户\ XXX \ Anaconda3 \ LIB \站点包\大熊猫\核心\ generic.py” 第1351行,在_get_item_cache中 res = self._box_item_values(item,values)
文件 “E:\ Users \ XXX \ Anaconda3 \ lib \ site-packages \ pandas \ core \ frame.py”,line 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)
有效。我想知道我可能会遗漏一些东西吗?
谢谢!
答案 0 :(得分:19)
原始错误的原因:
Pandas DataFrame set_value(index,col,value)方法将返回发布的模糊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)
希望这可以帮助其他人诊断同样的问题。
答案 1 :(得分:0)
假设您的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
你还有另一个带有city-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
你可以像这样将城市映射到城市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
PS在使用95%的Pandas时,你并不需要循环使用DF来实现目标