我有两个数据帧,一个带有输入信息,另一个带有输出:
df_input:
index col1 col2
0 'A' 'B'
1 'B' 'H'
2 'C' 'D'
df_output:
index vectors
0 [[D, 0.5],[E, 0.3]]
1 [[A, 0.3]]
2 [[B, 0.8],[C, 0.5],[H, 0.2]]
输出是一个数组数组。数量可变。
我需要的是映射索引,并将每个向量附加在一行中,如下所示:
df:
index col1 col2 val1 val2
0 'A' 'B' 'D' 0.5
1 'A' 'B' 'E' 0.3
2 'B' 'H' 'A' 0.3
3 'C' 'D' 'B' 0.8
4 'C' 'D' 'C' 0.5
5 'C' 'D' 'H' 0.2
df非常大,因此我试图尽可能避免循环。
先谢谢您的估计。
答案 0 :(得分:2)
位置:
input_vectors = pd.DataFrame({'vectors':[[['D', .5],['E',.3]],
[['A',.3]],
[['B',.8],['C',.5],['H',.2]]]})
input_vectors
输出:
vectors
0 [[D, 0.5], [E, 0.3]]
1 [[A, 0.3]]
2 [[B, 0.8], [C, 0.5], [H, 0.2]]
和
df_input
输出:
index col1 col2
0 0 A B
1 1 B H
2 2 C D
使用:
pd.concat([pd.DataFrame(x, index=[i]*len(x))
for i, x in input_vectors.itertuples()])\
.join(df_input)
输出:
0 1 index col1 col2
0 D 0.5 0 A B
0 E 0.3 0 A B
1 A 0.3 1 B H
2 B 0.8 2 C D
2 C 0.5 2 C D
2 H 0.2 2 C D
答案 1 :(得分:0)
使用堆栈功能将列表列表拆分为行。然后,对于vectors列中的每一行,将其转换为字符串,并使用split函数创建两列va1和va2。使用concat通过索引列连接两个数据框。删除列索引,因为在最终输出中不需要该列索引。
import pandas as pd
my_dict = {'index':[0,1,2], 'col1':['A','B','C'], 'col2':['B','H','D']}
df_input = pd.DataFrame(my_dict)
my_dict = {'index':[0,1,2],'vectors':[[['D', 0.5],['E', 0.3]],[['A', 0.3]],[['B', 0.8],['C', 0.5],['H', 0.2]]]}
df_output = pd.DataFrame(my_dict)
df_output = df_output.vectors.apply(pd.Series).stack().rename('vectors')
df_output = df_output.to_frame().reset_index(1, drop=True).reset_index()
df_tmp = df_output.vectors.apply(lambda x: ','.join(map(str, x))).str.split(',', expand=True)
df_tmp.columns = ['va1','val2']
df_tmp = pd.concat([df_tmp, df_output['index']], axis=1, sort=False)
df_tmp = df_input.join(df_tmp.set_index('index'), on='index')
df_tmp.reset_index(drop=True).drop(columns=['index'])
结果:
col1 col2 va1 val2
0 A B D 0.5
1 A B E 0.3
2 B H A 0.3
3 C D B 0.8
4 C D C 0.5
5 C D H 0.2