Подтвердить что ты не робот

Добавить столбец в dataframe из списка

У меня есть датафрейм с некоторыми столбцами, как это:

A   B   C  
0   
4
5
6
7
7
6
5

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

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

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

Если элементом в столбце A является n, мне нужно вставить n-й элемент из списка в новый столбец, скажем, "D".

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

Результирующий кадр данных будет выглядеть так:

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

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

4b9b3361

Ответ 1

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

>>> import numpy as np
>>> 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 вызывал некоторые головные боли, Вещи улучшились сейчас.

Ответ 2

Просто назначьте список напрямую:

df['new_col'] = mylist

Альтернативный
Преобразуйте список в серию или массив, а затем назначьте:

se = pd.Series(mylist)
df['new_col'] = se.values

или

df['new_col'] = np.array(mylist)

Ответ 3

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

Пусть df, ваш набор данных, и mylist список со значениями, которые вы хотите добавить в фрейм данных.

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

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

column_values = pd.Series(mylist)

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

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

Ответ 4

Сначала позвольте создать структуру данных, которую вы имели, я буду игнорировать столбцы 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

Ответ 5

Старый вопрос; но я всегда стараюсь использовать самый быстрый код!

У меня был огромный список с 69 миллионами uint64. np.array() был самым быстрым для меня.

df['hashes'] = hashes
Time spent: 17.034842014312744

df['hashes'] = pd.Series(hashes).values
Time spent: 17.141014337539673

df['key'] = np.array(hashes)
Time spent: 10.724546194076538