从列表添加列到数据框
我有一个数据表,里面有一些列,长得像这样:
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 个回答
首先,我们来创建你提到的数据表,我会忽略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
这是个老问题,但我总是想用最快的代码!
我有一个包含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
这是一个在@sparrow的优秀方案基础上改进的解决办法。
假设df是你的数据集,而mylist是你想要添加到数据框中的值的列表。
我们假设你想把新列叫做new_column。
首先,把这个列表转换成一个Series(序列):
column_values = pd.Series(mylist)
然后使用insert函数来添加这个新列。这个函数的好处是你可以选择新列放在什么位置。在下面的例子中,我们将新列放在最左边的位置(通过设置loc=0)。
df.insert(loc=0, column='new_column', value=column_values)
直接把列表赋值就可以了:
df['new_col'] = mylist
另一种方法
把列表转换成一个序列或者数组,然后再进行赋值:
se = pd.Series(mylist)
df['new_col'] = se.values
或者
df['new_col'] = np.array(mylist)
如果我理解得没错的话,如果你把你那个(名字不太好听的)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
的一些改动也让人头疼。不过现在情况已经好多了。