我有一个包含这样的列的数据框:
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
如果A列中的元素是 n ,我需要在新列中插入List中的 n 元素,比如'D'。
如何在不循环整个数据帧的情况下一次完成此操作?
结果数据框如下所示:
A B C D
0 2
4 12
5 16
6 26
7 32
7 32
6 26
5 16
注意:数据框很大,迭代是最后一个选项。但是如果需要的话,我还可以在任何其他数据结构(如dict)中排列'List'中的元素。
答案 0 :(得分:175)
直接分配列表:
df['new_col'] = mylist
<强>替代强>
将列表转换为系列或数组,然后分配:
se = pd.Series(mylist)
df['new_col'] = se.values
或
df['new_col'] = np.array(mylist)
答案 1 :(得分:31)
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]
- 过去,numpy
没有播放与其他人一起,pandas
中的一些重构引起了一些令人头疼的问题。现在情况有所改善。
答案 2 :(得分:9)
改善@sparrow上伟大的解决方案。
让 df 成为您的数据集, mylist 列表中包含您要添加到数据框的值。
假设您想简单地调用新列, new_column
首先将列表设为系列:
column_values = pd.Series(mylist)
然后使用插入功能添加列。此功能的优点是可以让您选择要放置列的位置。 在下面的示例中,我们将新列放在左起第一个位置(通过设置loc = 0)
df.insert(loc=0, column='new_column', value=column_values)
答案 3 :(得分:8)
首先让我们创建你拥有的数据帧,我将忽略列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
答案 4 :(得分:1)
您也可以使用df.assign
:
In [1559]: df
Out[1559]:
A B C
0 0 NaN NaN
1 4 NaN NaN
2 5 NaN NaN
3 6 NaN NaN
4 7 NaN NaN
5 7 NaN NaN
6 6 NaN NaN
7 5 NaN NaN
In [1560]: mylist = [2,5,6,8,12,16,26,32]
In [1567]: df = df.assign(D=mylist)
In [1568]: df
Out[1568]:
A B C D
0 0 NaN NaN 2
1 4 NaN NaN 5
2 5 NaN NaN 6
3 6 NaN NaN 8
4 7 NaN NaN 12
5 7 NaN NaN 16
6 6 NaN NaN 26
7 5 NaN NaN 32
答案 5 :(得分:-1)
旧问题;但我总是尝试使用最快的代码!
我有一个庞大的列表,其中包含6900万个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