我需要以以下格式填充熊猫数据框
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玩,但无法正常工作。
答案 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
由于两个解决方案均未向量化,我想知道哪种性能受到的影响更大。
结果
基准代码
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)')