跨多个数据框计算新列
Posted
技术标签:
【中文标题】跨多个数据框计算新列【英文标题】:Calculate new column across multiple dataframes 【发布时间】:2017-09-30 15:51:01 【问题描述】:我是 pandas 的新手,我希望从具有多个数据框的多个 excel 工作表中重做以下内容。
这是高级结构:
Master_df Master_UID |组件_ID_1 |数量_1 | ... |组件_ID_8 |数量_8
Component_type_1_df 组件_ID | ... |重量
Component_type_2_df 组件_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']。
【问题讨论】:
忘了说,Component_type_X_df 的结构不同。另外,我也在寻找一种方法来避免合并到 Master_df 但只包含新的计算。 【参考方案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
【讨论】:
嗨耶鲁!完美! 如果这是您运行的内容,请接受答案:) 嗨@yale-newman!完美运行!对于使用此解决方案的其他任何人,只需稍作修正,请使用 '...[weight]) * Master_df['Quantity_1']' 来匹配问题。再次感谢,我会检查你的链接,让我的 excel 大脑慢慢转换为 Pandas :)【参考方案2】:由于两个Component_type_*_df
DataFrames不具有相同的结构,因此只需连接这些 DataFrames 中您需要的部分,
然后将结果与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
数据帧限制为仅两列,
并且一列用作合并键,合并只增加一列
列,weight
到 Master_df
。
由于您不希望在 Master_df
中合并 weight
列,因此
上面的代码在Master_df['weight']
中执行计算,然后重命名
那个专栏Weight_1
。
【讨论】:
您好,unutbu,感谢您的回答。抱歉,我没有澄清,但 Component_type_X_df 的结构不同。我也在寻找一种方法来避免合并到 Master_df 但只包含新的计算。以上是关于跨多个数据框计算新列的主要内容,如果未能解决你的问题,请参考以下文章