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

我有一个数据框,其中有一些列如下:

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 中的第十个元素插入到一个新列中,比如说‘ D’。

我怎样才能一次完成而不需要循环遍历整个数据框架呢?

由此产生的数据框架如下:

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

注意: 数据框架非常庞大,迭代是最后一个选项。但是,如果需要,我也可以将“ List”中的元素排列在任何其他数据结构中,如 dict。

458540 次浏览

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中的一些重构会引起一些问题。现在情况好转了。

首先让我们创建数据框架,我将忽略列 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

只要直接分配名单:

df['new_col'] = mylist

另一种选择
将列表转换为序列或数组,然后赋值:

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

或者

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

一个改进了“麻雀”的伟大解决方案。

Df成为您的数据集,并让 我的名单成为您想要添加到数据框中的值的列表。

让我们假设您想简单地将新列命名为 New _ column

首先列出一个系列:

column_values = pd.Series(mylist)

然后使用 插入函数添加列。此函数的优点是允许您选择要将列放置在哪个位置。 在下面的示例中,我们将新列放置在从左开始的第一个位置(通过设置 loc = 0)

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

这是个老问题了,但我总是尽量使用最快的代码!

我有一个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

你也可以使用 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