han*_*zgs 3 python numpy pandas
我有一个熊猫数据框
data = [[0, 10, 22000, 3],
[1, 15, 42135, 4],
[0, 14, 13526, 5],
[0, 16, 32156, 3],
[1, 23, 13889, 5],
[0, 18, 18000, 6],
[0, 21, 13189, 2],
[1, 32, 58766, 2]]
df = pd.DataFrame(data, columns = ['Gender', 'Age', 'Amount','Dependents'])
Run Code Online (Sandbox Code Playgroud)
我有一个numpy数组
arr = numpy.array([[1, 15, 42135, 4],
[1, 23, 13889, 5],
[0, 21, 13189, 2]])
Run Code Online (Sandbox Code Playgroud)
在这里,我想在数据框'data'中创建一个新列(比如说'Good_Bad'),如果数组存在于数据中。
结果应该像
data = [[0, 10, 22000, 3, 0],
[1, 15, 42135, 4, 1],
[0, 14, 13526, 5, 0],
[0, 16, 32156, 3, 0],
[1, 23, 13889, 5, 1],
[0, 18, 18000, 6, 0],
[0, 21, 13189, 2, 1],
[1, 32, 58766, 2, 0]]
Run Code Online (Sandbox Code Playgroud)
记录2,5,7在新列中有1,其他记录有0。不确定如何映射数组和数据框。
方法1
向量化broadcasting-
dfc = df[['Gender','Age','Amount','Dependents']] # select relevant cols
df['Good_Bad'] = (dfc.values[:,None]==arr).all(2).any(1).astype(int)
Run Code Online (Sandbox Code Playgroud)
在较新的熊猫版本(> = v0.24)上,使用dfc.to_numpy(copy=False)代替dfc.values。
方法2
这是views用于存储的,因此可以提高性能-
# /sf/answers/3171934741/ @Divakar
def view1D(a, b): # a, b are arrays
# This function gets 1D view into 2D input arrays
a = np.ascontiguousarray(a)
b = np.ascontiguousarray(b)
void_dt = np.dtype((np.void, a.dtype.itemsize * a.shape[-1]))
return a.view(void_dt).ravel(), b.view(void_dt).ravel()
D,A = view1D(dfc,arr)
df['Good_Bad'] = np.isin(D,A).astype(int)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
102 次 |
| 最近记录: |