2016-05-30 3 views
4

Есть проблемы с Панды в Python 3.5Невозможно выполнить Python панда set_value

Я читаю местную 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. Функция печати работает хорошо, если I удалить set_value, но с

df.set_value(i, 'Name', 123) 

Тогда ошибка информация:

Traceback (most recent call last): File "D:/xxx/test.py", line 20, in df.set_value(i, 'Name', 233)

File "E:\Users\XXX\Anaconda3\lib\site-packages\pandas\core\frame.py", line 1862, in set_value series = self._get_item_cache(col)

File "E:\Users\XXX\Anaconda3\lib\site-packages\pandas\core\generic.py", line 1351, in _get_item_cache res = self._box_item_values(item, values)

File "E:\Users\XXX\Anaconda3\lib\site-packages\pandas\core\frame.py", line 2334, in _box_item_values

return self._constructor(values.T, columns=items, index=self.index)

AttributeError: 'BlockManager' object has no attribute 'T'

Но если я создаю dataframe вручную в коде

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) 

Это сработало. Мне интересно, может быть, что-то мне не хватает?

Спасибо!

+1

Почему бы вам не просто сделать следующее вместо вашего цикла: 'df ['Name'] = 123'? – MaxU

+0

Потому что не каждая ячейка должна быть 123 – Windtalker

+0

Но в вашем коде вы устанавливаете 123 на весь столбец «Имя» - не могли бы вы уточнить, чего вы собираетесь достичь? – MaxU

ответ

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 

и вы hasve другой 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 

вы можете карту города в город-ид, как это:

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% вы на самом деле не нужны проходной вашем DF для того, чтобы достичь ваших целей

12

Причины первоначальной ошибки:

Панды DataFrame set_value (индекс, седловин , value) возвратит опубликованный объект obsributeError: объект «BlockManager» не имеет атрибута «T», когда модифицируемый файл данных имеет повторяющиеся имена столбцов.

Ошибка может быть воспроизведена с использованием приведенного выше кода @Windtalker, где сделано единственное изменение: имена столбцов теперь являются как «х», а не «х» и «у».

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) 

Надеюсь, это поможет кому-то еще диагностировать ту же проблему.

+0

Очень сложно отследить эту проблему до дублированных столбцов. Я бы сказал, на самом деле это ошибка. Вы сообщили об этом? – Konstantin

Смежные вопросы