无法执行Python Pandas set_value

时间:2016-05-30 20:24:17

标签: python csv pandas

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)

有效。我想知道我可能会遗漏一些东西吗?

谢谢!

2 个答案:

答案 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来实现目标