计算跨多个数据帧的新列

时间:2017-09-30 15:51:01

标签: python pandas dataframe view calculation

我是pandas的新手,我希望从包含多个数据帧的多个Excel工作表中重做以下内容。

这是高级结构:

Master_df
Master_UID | Component_ID_1 | Quantity_1 | ...... | Component_ID_8 | Quantity_8

Component_type_1_df
Component_ID | ...... |重量

Component_type_2_df
Component_ID | ...... |重量

Master_UID ['Component_ID_1']包含Component_type_1_df和Component_type_2_df

中的'Component_ID'

现在在 Master_df 中,我想根据2个Component_type_X_df中的 weight 创建列 Weight_1 列。

乘以Master_df ['Quantity_1']。

2 个答案:

答案 0 :(得分:1)

由于两个Component_type_*_df DataFrames 没有具有相同的结构,因此只连接您需要的这些DataFrame的部分, 然后将结果与Master_df合并。

cols = ['Component_ID', 'weight']
Components_df = pd.concat([Component_type_1_df[cols], Component_type_2_df[cols]], axis=0)
Master_df = pd.merge(Master_df, Components_df, 
                     left_on='Component_ID_1',
                     right_on='Component_ID', how='left')
Master_df['weight'] = Master_df['weight'] * Master_df['Quantity_1']
Master_df = Master_df.rename({'weight':'Weight_1'})

由于我们已将Component_type_*_df DataFrame限制为仅两列, 并且一列用作合并键,合并仅添加一个 列,weightMaster_df

由于您不希望在weight中包含合并的Master_df列,因此 上面的代码执行Master_df['weight']中的计算,但随后重命名 该列Weight_1

答案 1 :(得分:1)

Master_df['Weight_1'] = Master_df['Component_ID'].map(Component_type_1_df.set_index('Component_ID')['weight']) * Master_df['Quantity']

如果没有可以使用的数据集,我无法保证这将按预期工作,但地图功能应该可以帮助您到达您想去的地方。

如果您不想将计算出的重量列附加到主df的末尾,则可以执行以下操作:

Master_df.insert({desired_index_position},'Weight_1', Master_df['Component_ID'].map(Component_type_1_df.set_index('Component_ID')['weight']) * Master_df['Quantity')

我实际上最近发布了一个与此类似的问题。我发布了一个数据集,因此你可以学习这个功能。

PANDAS vlookup against series with common index using map