【问题标题】:Is it possible to merge data frames with one column from the first dataframe mapped across numerous columns in a second dataframe?是否可以将数据帧与映射到第二个数据帧中众多列的第一个数据帧中的一列合并?
【发布时间】:2021-03-07 13:04:16
【问题描述】:

我有两个数据框:

数据框 1(项目数据)

project_data = pd.DataFrame({'record_id' : ('1','2','3'), 'account_number' : ('123','124','125'), 'city' :('Vancouver','Miami','Dublin'),'salary' :(70000,80000,65000)})

Dataframe 2(项目数据字典)

data_dict = pd.DataFrame({'variable_name' : ('record_id','account_number','city','salary'), 'form_name' : ('crosswalk_form','crosswalk_form','demographics','demographics')})

我希望能够从 Dataframe 2(数据字典)中引入 form_name 变量,但由于数据框之间没有可连接的公共列,因此不知道如何去做。

我想问有没有一种方法可以将数据框 1(项目数据)中的列标题连接到数据框 2(数据字典)中的 variable_name 列。还是我需要重塑其中一个数据框(可能是 Dataframe 1)?

可能的输出

merged_data = pd.DataFrame({'record_id' : ('1','2','3'), 'account_number' : ('123','124','125'), 'city' :('Vancouver','Miami','Dublin'),'salary' :(70000,80000,65000),'form_name' : ('crosswalk_form','crosswalk_form','demographics')})

我希望这个form_name 列对变量进行分类,以获取我想要进一步做的一些描述性统计数据。谢谢。

【问题讨论】:

  • 这能回答你的问题吗? Pandas Merging 101
  • merged_data 中的form_name 列在逻辑上是错误的,因为form_name 应该与特定的列相关联,而不是与行相关联。因此,这个问题似乎无法通过编辑来解决。 OP 必须重新考虑用例并定义逻辑上可行的输出规范。
  • @BillHuang 是的,这是正确的,我没有跨数据帧的公共密钥。我只是想知道有没有办法重塑数据(数据框 1)所以我可以在重塑后的数据框上进行合并,并将重塑后的数据框的列重命名为与其他数据框(数据框 2)相同所以我可以这样做。谢谢。
  • DF 2 (salary demographics) 中的最后一行在您可能的输出中位于何处?无缘无故消失了?
  • @BillHuang DF 2 不是数据,而是描述正在收集的项目数据的元数据。我只是想知道有没有一种方法可以利用这些数据来帮助根据form_name 对字段进行分类。感谢以下解决方案。我必须测试我是否可以使用新的MultiIndex。我是这类工作的新手,Multindex 对您的工作示例特别有用吗?将列/行分组在一起?

标签: python-3.x pandas dataframe merge


【解决方案1】:

可以构造一个新的MultiIndex 来直接替换原来的列。 (假设列的排列顺序与第二个数据帧的顺序相同)。

project_data.columns = pd.MultiIndex.from_tuples([
    (tup.form_name, tup.variable_name) for tup in data_dict.itertuples(index=False)
])

输出

print(project_data)
  crosswalk_form                demographics       
       record_id account_number         city salary
0              1            123    Vancouver  70000
1              2            124        Miami  80000
2              3            125       Dublin  65000

这确实完成了 OP 的要求。但是,这种替换是否能很好地服务于实际用例还有待澄清。

【讨论】:

    猜你喜欢
    • 2021-03-10
    • 2020-06-22
    • 2021-04-26
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 2022-01-24
    • 1970-01-01
    相关资源
    最近更新 更多