当前位置: 首页 > 知识库问答 >
问题:

将多个键上的数据帧映射为列或多索引

东方和惬
2023-03-14

设置:两个数据帧;需要将来自df2的数据添加到df1中,如下所述:

  • df1和df2使用相同的四个级别进行多重索引
  • df1比df2包含更多的行
  • df1在索引的四个级别中的三个级别中的每个唯一组合都有三个值的副本(以行为单位);也就是说,每行仅相对于第4个级别有所不同
  • df2在其他3个级别上只与df1部分对齐(df2包含无关行)
  • df2只包含一列

我想将df2的一列中的值添加到df1中三个对应级别匹配的行的所有三个副本中。

了解到pandas中的“在多索引上不实现与多个级别重叠的合并”,我建议映射值,但没有找到映射(多个)索引级别或多个列的方法,如果将索引级别重置为列:

df1 = pd.DataFrame(np.array([['Dec', 'NY', 'Ren', 'Q1', 10],
   ['Dec', 'NY', 'Ren', 'Q2', 12],
   ['Dec', 'NY', 'Ren', 'Q3', 14],
   ['Dec', 'FL', 'Mia', 'Q1', 6],
   ['Dec', 'FL', 'Mia', 'Q2', 8],
   ['Dec', 'FL', 'Mia', 'Q3', 17],
   ['Apr', 'CA', 'SC', 'Q1', 1],
   ['Apr', 'CA', 'SC', 'Q2', 2],
   ['Apr', 'CA', 'SC', 'Q3', 3]]), columns=['Date', 'State', 'County', 'Quarter', 'x'])

df1.set_index(['Date', 'State', 'County', 'Quarter'], inplace=True)

df2 = pd.DataFrame(np.array([['Dec', 'NY', 'Ren', 0.4],
   ['Dec', 'FL', 'Mia', 0.3]]), columns=['Date', 'State', 'County', 'y'])

df2.set_index(['Date', 'State', 'County', 'y'], inplace=True)

df_combined = df1['Date', 'State', 'County'].map(df2)

共有1个答案

董畅
2023-03-14

您可以临时更改df1来更改索引以进行连接:

df_combined = df1.reset_index(3).join(df2,how='left')

>>> df_combined
           level_3   x    y
Apr CA SC       Q1   1  NaN
       SC       Q2   2  NaN
       SC       Q3   3  NaN
Dec FL Mia      Q1   6  0.3
       Mia      Q2   8  0.3
       Mia      Q3  17  0.3
    NY Ren      Q1  10  0.4
       Ren      Q2  12  0.4
       Ren      Q3  14  0.4

df_combined.set_index('level_3',append=True, inplace=True)
df_combined.index.rename(None,3,inplace=True)

>>> df_combined
                x    y
Apr CA SC  Q1   1  NaN
           Q2   2  NaN
           Q3   3  NaN
Dec FL Mia Q1   6  0.3
           Q2   8  0.3
           Q3  17  0.3
    NY Ren Q1  10  0.4
           Q2  12  0.4
           Q3  14  0.4

reset_index方法用于临时将不在df2中的索引转换为列,以便进行正常连接。完成后,将该列重新转换为索引。

 类似资料:
  • 我有一个多索引数据框(索引和)如下: 我想将转换为以下内容(其中索引转换为列,其中为值,保留为索引): 我一直在努力做到这一点,但还没走多远。

  • 问题内容: 输入值 我有一列类型的表格: 输出量 我想在pyspark重塑它,这样所有的按键(,,等)都列,分别为: 使用作品: 但是 我需要一个解决方案, 因为我有很多 列名称,所以没有明确提及列名称 。 架构图 问题答案: 由于的键不是架构的一部分,因此您必须首先收集这些键,例如: 当您拥有了这些之后,剩下的就是简单的选择:

  • 我在Spark中有一个数据框,看起来像这样: 它有30列:只显示其中的一些! 因此,我必须在Scala中将这个数据帧转换成一个键值对,使用键作为数据帧中的一些列,并为这些键分配从索引0到计数(不同的键数)的唯一值。 例如:使用上面的案例,我希望在Scala中的map(key-value)集合中有一个输出,如下所示: 我对斯卡拉和斯帕克是新手,我试着做这样的事情。 但是,这不起作用。:/此操作完成后

  • 我需要合并两个数据帧。为了确保行是唯一的,我需要在合并之前验证“Name”和“Age”是否匹配。我将组合用作主键。这是我的密码: 当我使用多个键(“姓名”和“年龄”)时,这是一个“和”或“或”匹配。我只希望它在“Name”和“Age”匹配时合并,而不是只在“Name”或“Age”匹配时合并。我似乎在文档中找不到这一点,我得到了一些混合的结果。 更新:由于数据原因,我确实需要进行左连接。右边的表是我

  • 我有两个不同列数和行数的CSV文件。第一个CSV文件有M列和N行,第二个文件有H列和G行。一些列具有相同的名称。 null 另外,如果两个CSV文件有两个数据帧,并希望这样做,例如,如果我将第一个CSV加载到中,将第二个加载到中,然后希望合并到,类似于上面的示例。

  • 我正在Spark 3.0.0上执行Spark结构流的示例,为此,我使用了twitter数据。我在Kafka中推送了twitter数据,单个记录如下所示 2020-07-21 10:48:19|1265200268284588034|RT@narendramodi:与@IBM首席执行官@ArvindKrishna先生进行了广泛的互动。我们讨论了几个与技术相关的主题,…|印度海得拉巴 在这里,每个字段