无法执行Python Pandas set_value

Win*_*ker 7 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
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)

希望这有助于其他人诊断同样的问题.

  • 将此问题追溯到重复的列非常困难。我会说这实际上是一个错误。你有报道吗 (2认同)

Max*_*axU 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
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 来实现你的目标