man*_*ane 70 python dataframe pandas
我有一个包含这样的列的数据框:
A B C
0
4
5
6
7
7
6
5
Run Code Online (Sandbox Code Playgroud)
A中可能的值范围仅为0到7.
另外,我有一个包含8个这样的元素的列表:
List=[2,5,6,8,12,16,26,32] //There are only 8 elements in this list
Run Code Online (Sandbox Code Playgroud)
如果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
Run Code Online (Sandbox Code Playgroud)
注意:数据框很大,迭代是最后一个选项.但是如果需要的话,我还可以在任何其他数据结构(如dict)中排列'List'中的元素.
spa*_*row 219
(对于只想知道如何简单地将列表指定为新列的用户)
实际上,一个更简单的方法是直接分配列表:
df['new_col'] = mylist
Run Code Online (Sandbox Code Playgroud)
替代
分配系列:
se = pd.Series(mylist)
df['new_col'] = se.values
Run Code Online (Sandbox Code Playgroud)
你甚至可以只分配数组
df['new_col'] = np.array(mylist)
Run Code Online (Sandbox Code Playgroud)
DSM*_*DSM 39
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
Run Code Online (Sandbox Code Playgroud)
在这里我构建了一个新的m,但如果你使用m = np.asarray(List),同样的东西应该工作:值df.A中将挑选出适当的元素m.
请注意,如果您使用的是旧版本numpy,则可能必须使用 - m[df.A.values]过去,numpy与其他人不能很好地兼容,并且一些重构pandas导致了一些令人头疼的问题.事情现在有所改善.
Sal*_*ino 12
从@sparrow改进伟大的解决方案.
让df成为您的数据集,并使用要添加到数据框的值对列表进行mylist.
假设您想简单地调用新列,new_column
首先将列表变为系列:
column_values = pd.Series(mylist)
Run Code Online (Sandbox Code Playgroud)
然后使用insert函数添加列.此功能的优点是可以让您选择要放置列的位置.在下面的示例中,我们将新列放在左起第一个位置(通过设置loc = 0)
df.insert(loc=0, column='new_column', value=column_values)
Run Code Online (Sandbox Code Playgroud)
Meh*_*hdi 10
老问题;但我总是尝试使用最快的代码!
我有一个包含 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
Run Code Online (Sandbox Code Playgroud)
首先让我们创建你拥有的数据帧,我将忽略列B和C,因为它们不相关.
df = pd.DataFrame({'A': [0, 4, 5, 6, 7, 7, 6,5]})
Run Code Online (Sandbox Code Playgroud)
你想要的映射:
mapping = dict(enumerate([2,5,6,8,12,16,26,32]))
df['D'] = df['A'].map(mapping)
Run Code Online (Sandbox Code Playgroud)
完成!
print df
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
您还可以使用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
Run Code Online (Sandbox Code Playgroud)