从列表添加列到数据框

178 投票
6 回答
559239 浏览
提问于 2025-04-30 19:14

我有一个数据表,里面有一些列,长得像这样:

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,我需要把这个列表中的第n个元素放到一个新列里,叫做'D'。

我该怎么做才能一次性完成,而不需要一个一个地遍历整个数据表呢?

最后得到的数据表会是这样的:

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

注意:这个数据表非常大,所以遍历是最后的选择。不过,如果需要的话,我也可以把'List'中的元素放到其他数据结构里,比如字典。

暂无标签

6 个回答

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
10

这是个老问题,但我总是想用最快的代码!

我有一个包含6900万个无符号64位整数的大列表。对我来说,使用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
20

这是一个在@sparrow的优秀方案基础上改进的解决办法。

假设df是你的数据集,而mylist是你想要添加到数据框中的值的列表。

我们假设你想把新列叫做new_column

首先,把这个列表转换成一个Series(序列):

column_values = pd.Series(mylist)

然后使用insert函数来添加这个新列。这个函数的好处是你可以选择新列放在什么位置。在下面的例子中,我们将新列放在最左边的位置(通过设置loc=0)。

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

直接把列表赋值就可以了:

df['new_col'] = mylist

另一种方法
把列表转换成一个序列或者数组,然后再进行赋值:

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

或者

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

如果我理解得没错的话,如果你把你那个(名字不太好听的)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的一些改动也让人头疼。不过现在情况已经好多了。

撰写回答