Добавить столбец в 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, если это необходимо.
Ответы
Ответ 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