将多个numpy列分配给一个pandas数据框列

时间:2020-09-20 10:16:10

标签: pandas numpy dataframe

我需要以以下格式填充熊猫数据框

ID.  vector1              vector2        scalar
11  [0.34, 0.56, 0.99]   [0.24, 0.44]   9
23  [0.12, 0.66, 0.21]   [0.21, 0.24]   4
...

我的输入数据是以下格式的numpy数组

[
[11 0.34 0.56 0.99 0.24 0.44 9]
[23 0.12 0.66 0.21 0.21 0.24 4]
]

我尝试使用hsplit玩,但无法正常工作。

2 个答案:

答案 0 :(得分:2)

cell[Reduce(`|`, lapply(list(a, b), function(x) 
           colSums(t(support) == x) == length(x))), ]

如果import numpy as np import pandas as pd input = np.array([ [11, 0.34, 0.56, 0.99, 0.24, 0.44, 9], [23, 0.12, 0.66, 0.21, 0.21, 0.24, 4] ]) df = pd.DataFrame(input) 是您的起始数据帧...

df

您可以按以下方式组合列以获取所需的输出。

可以帮助您的主要因素是lambda函数-只需将所需的列放在方括号中,并确保设置 0 1 2 3 4 5 6 11.0 0.34 0.56 0.99 0.24 0.44 9.0 23.0 0.12 0.66 0.21 0.21 0.24 4.0 即可将该函数传递给数据框的列。

axis=1

输出

df2 = df[0].to_frame()
df2.columns = ['ID.']
df2['vector1'] = df.apply(lambda x: [x[1], x[2], x[3]], axis=1)
df2['vector2'] = df.apply(lambda x: [x[4], x[5]], axis=1)
df2['scalar'] = df[6]

答案 1 :(得分:1)

您可以将numpy切片转换为列表,以将其添加到数据框。
设置数据框

import numpy as np
import pandas as pd

input_data = np.array([
    [11, 0.34, 0.56, 0.99, 0.24, 0.44, 9],
    [23, 0.12, 0.66, 0.21, 0.21, 0.24, 4]
])
df = pd.DataFrame({
    'ID.': input_data[:,0].astype(np.int),
    'scalar':input_data[:,-1].astype(np.int)
})

input_data作为列表添加到数据框

df['vector1'] = input_data[:,1:4].tolist()
df['vector2'] = input_data[:,4:6].tolist()
df[['ID.', 'vector1', 'vector2', 'scalar']]

输出

   ID.             vector1       vector2  scalar
0   11  [0.34, 0.56, 0.99]  [0.24, 0.44]       9
1   23  [0.12, 0.66, 0.21]  [0.21, 0.24]       4

微基准测试

由于两个解决方案均未向量化,我想知道哪种性能受到的影响更大。
结果

benchmark results

基准代码

import numpy as np
import pandas as pd

def create_data(n):
    input_data = np.array([
        [11, 0.34, 0.56, 0.99, 0.24, 0.44, 9],
        [23, 0.12, 0.66, 0.21, 0.21, 0.24, 4]
    ])
    return np.repeat(input_data, n, 0)

def add_with_list(input_data):
    df = pd.DataFrame({
        'ID.': input_data[:,0].astype(np.int),
        'scalar':input_data[:,-1].astype(np.int)
    })
    df['vector1'] = input_data[:,1:4].tolist()
    df['vector2'] = input_data[:,4:6].tolist()
    return df[['ID.', 'vector1', 'vector2', 'scalar']]

def add_with_apply(input_data):
    df = pd.DataFrame(input_data)
    df2 = df[0].to_frame()
    df2.columns = ['ID.']
    df2['vector1'] = df.apply(lambda x: [x[1], x[2], x[3]], axis=1)
    df2['vector2'] = df.apply(lambda x: [x[4], x[5]], axis=1)
    df2['scalar'] = df[6]
    return df2

import perfplot

perfplot.show(
    setup=create_data,
    kernels=[add_with_list, add_with_apply],
    n_range=[2**k for k in range(2,20)],
    logx=True,
    logy=True,
    equality_check=False,
    xlabel='len(df)')