从列表中添加数据框中的列

时间:2014-10-31 03:00:31

标签: python pandas 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

如果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'中的元素。

6 个答案:

答案 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