2014-10-31 5 views
26

[EDIT: Неправильный Заголовок/название поста исправлено]Python панд добавить столбец в dataframe из списка

У меня есть dataframe с некоторыми колоннами, как это:

A B C 
0 
4 
5 
6 
7 
7 
6 
5 

возможный диапазон значений A - только от 0 до 7.

Кроме того, у меня есть список из 8 элементов, как это:

List=[2,5,6,8,12,16,26,32] //There are only 8 elements in this list 

Если элемент в столбце А п, мне нужно вставить н й элемент из списка в новый столбец, скажем 'D'.

Как я могу сделать это за один проход, не зацикливая на весь фрейм данных?

В результате dataframe будет выглядеть следующим образом:

A B C D 
0   2 
4   12 
5   16 
6   26 
7   32 
7   32 
6   26 
5   16 

(Примечание: dataframe огромен и итерация последний вариант вариант Но я также могу расположить элементы в «Список» в любой другой структуре данных. например, dict, если необходимо)

+0

Думаю, вам нужен пример с меньшим количеством игрушек с желаемым результатом. Это звучит немного неопределенно. –

ответ

18

IIUC, если вы сделали свой (к сожалению, по имени) List в ndarray, вы можете просто индексировать его естественно.

>>> m = np.arange(16)*10 
>>> m[df.A] 
array([ 0, 40, 50, 60, 150, 150, 140, 130]) 
>>> df["D"] = m[df.A] 
>>> df 
    A B C D 
0 0 NaN NaN 0 
1 4 NaN NaN 40 
2 5 NaN NaN 50 
3 6 NaN NaN 60 
4 15 NaN NaN 150 
5 15 NaN NaN 150 
6 14 NaN NaN 140 
7 13 NaN NaN 130 

Здесь я построил новый m, но если вы используете m = np.asarray(List), то же самое должно работать: значения в df.A будут выбирать соответствующие элементы m.


Обратите внимание, что если вы используете старую версию numpy, вы, возможно, придется использовать m[df.A.values] instead-- в прошлом, numpy не хорошо играть с другими, а некоторые рефакторинга в pandas вызвало некоторые головные боли , Теперь ситуация улучшилась.

+0

Hi @DSM. Я получаю то, что вы говорите, но я получаю эту ошибку: 'Traceback (самый последний вызов в прошлом):' ' Файл "./b.py", строка 24, в ' 'D [D" "] = m [dA]' 'IndexError: неподдерживаемый индекс итератора' – mane

+1

@mane: urf, это старая ошибка« numpy ». Использует ли 'd [" D "] = m [d.A.values]' для вас? – DSM

+0

Удивительный! 'd [" D "] = m [d.A.values]' работает !!! Большое спасибо! – mane

7

Сначала давайте создадим данные, которые у вас были, я проигнорирую столбцы B и C, поскольку они не актуальны.

df = pd.DataFrame({'A': [0, 4, 5, 6, 7, 7, 6,5]}) 

А отображение, что вы хотите:

mapping = dict(enumerate([2,5,6,8,12,16,26,32])) 

df['D'] = df['A'].map(mapping) 

Готово!

print df 

Выход:

A D 
0 0 2 
1 4 12 
2 5 16 
3 6 26 
4 7 32 
5 7 32 
6 6 26 
7 5 16 
+1

Я думаю, что ОП знает, как это сделать уже. По моему чтению проблема заключается в создании 'D' из элементов' A' и 'List' (« Если элемент в столбце A равен n, мне нужно вставить n-й элемент из списка в новый столбец, скажем, D '. ") – DSM

+0

SO превратился в какое-то состояние F (* & nanny. Благодаря @DSM для комментария, но я не мог исправить сообщение до того, как он был просмотрен экспертом, а затем он был отклонен, потому что он был слишком быстро, и тогда я смог проверить мои собственные изменения, а потом уже слишком поздно, потому что хуже «IMHO» ответ был «принят». У SO действительно есть кое-какие метанамы, которые менее полезны !!!! –

+0

Ну, я не могу говорить за нянь, но вы обнаружите, что ваш подход примерно на порядок медленнее на длинных массивах. В других отношениях, конечно, выбирая между 'np.array (List) [df. A] 'и' df ["A"]. Map (dict (enumerate (List))) 'в основном зависит от предпочтений. – DSM

73

Сначала сделайте список в серии:

se = pd.Series(mylist) 

Затем добавить значения в DataFrame:

df['new_col'] = se.values 
+3

вы настоящий OG. Это было очень просто и точно, что мне нужно – wprins

+0

Вот что именно решает проблему. – Kulbear

+2

'pykernel_launcher.py:1: SettingWithCopy Предупреждение: Значение пытается быть установлено на копии среза из DataFrame. Попробуйте использовать .loc [row_indexer, col_indexer] = значение вместо См. Оговорки в документации: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy «« Точка входа для запуска ядра IPython ». –

0

Решение, улучшающееся на отличном от @sparrow.

Пусть ДФ, быть ваш набор данных, и MyList список со значениями, которые вы хотите добавить в dataframe.

Давайте предположим, что вы хотите назвать свой новый столбец просто new_column

Сначала сделайте список в серии:

column_values = pd.Series(mylist) 

Затем с помощью вставки функцию , чтобы добавить столбец. Эта функция имеет то преимущество, что вы можете выбрать, в какой позиции вы хотите поместить столбец. В следующем примере мы будем позиционировать новый столбец в первой позиции слева (установив LOC = 0)

df.insert(loc=0, column='new_column', value=column_values) 

Готово!

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