根据匹配的列标签将行值添加到数据框

Posted

技术标签:

【中文标题】根据匹配的列标签将行值添加到数据框【英文标题】:Adding row values to a dataframe based on matching column labels 【发布时间】:2018-11-27 05:05:06 【问题描述】:

我试图解决这个问题。 我有三个数据框,我想根据第三个数据框内的值合并(连接?)其中两个数据框。以下是数据框:

df1:

index,fields,a1,a2,a3,a4,a5
2018-06-01,price,1.1,2.1,3.1,4.1,5.1
2018-06-01,amount,15,25,35,45,55
2018-06-02,price,1.2,2.2,3.2,4.2,5.2
2018-06-02,amount,16,26,36,46,56
2018-06-03,price,1.3,2.3,3.3,4.3,5.3
2018-06-03,amount,17,27,37,47,57

df2:

index,fields,b1,b2,b3
2018-06-01,clients,1,2,3
2018-06-02,clients,1,2,3
2018-06-03,clients,1,2,3

df1 和 df2 中的列不同,但它们的关系在 df3 中。

df3:

index,product1,product2
0,a1,b1
1,a2,b1
2,a3,b2
3,a4,b2
4,a5,b3

我想合并 df1 和 df2 中的数据,但保留与 d1 中相同的列(因为 b1、b2、b3 被 a1、a2、a3、a4 和 a5 引用)。这是df4,我想要的数据框。

df4:

 index,fields,a1,a2,a3,a4,a5
 2018-06-01,price,1.1,2.1,3.1,4.1,5.1
 2018-06-01,amount,15,25,35,45,55
 2018-06-01,clients,1,1,2,2,3
 2018-06-02,price,1.2,2.2,3.2,4.2,5.2
 2018-06-02,amount,16,26,36,46,56
 2018-06-02,clients,4,4,5,5,6
 2018-06-03,price,1.3,2.3,3.3,4.3,5.3
 2018-06-03,amount,17,27,37,47,57
 2018-06-03,clients,7,7,8,8,9

非常感谢,

【问题讨论】:

试过 .join() 还是 .merge()?你的代码是什么? 【参考方案1】:

使用df.melt 取消旋转df2

df2_melt = df2.melt(["index", "fields"], var_name="product2")

从引用表df3pd.merge 中删除冗余列indexmelted df2

merged = pd.merge(df2_melt, df3.drop("index", axis=1), on="product2")\
    .drop("product2", axis=1)

从合并结果中执行pd.pivot_table

new_rows = pd.pivot_table(merged, index=["index", "fields"],
                          columns="product1", values="value")\
    .reset_index()

pd.concatdf1添加新行,对行进行排序并重置索引:

pd.concat([df1, new_rows]).sort_values("index").reset_index(drop=True)

结果

product1    index       fields  a1      a2      a3      a4      a5
0           2018-06-01  price   1.1     2.1     3.1     4.1     5.1
1           2018-06-01  amount  15.0    25.0    35.0    45.0    55.0
2           2018-06-01  clients 1.0     1.0     2.0     2.0     3.0
3           2018-06-02  price   1.2     2.2     3.2     4.2     5.2
4           2018-06-02  amount  16.0    26.0    36.0    46.0    56.0
5           2018-06-02  clients 1.0     1.0     2.0     2.0     3.0
6           2018-06-03  price   1.3     2.3     3.3     4.3     5.3
7           2018-06-03  amount  17.0    27.0    37.0    47.0    57.0
8           2018-06-03  clients 1.0     1.0     2.0     2.0     3.0

【讨论】:

【参考方案2】:

如果您重命名 df2 的列:

df2 = df2.rename(colunmns='b1':'a1', 'b2':'a2', 'b3':'a3')

然后你可以做一个简单的连接:

fields = [df1, df2]
df4 = pd.concat(fields)

你会得到想要的 df4

然而在 df2 中只有 a1-a3,而在 df4 中有 a1-a5 列,因此 df2 中的行对于 a4、a5 将具有 NaN,除非您以某种方式创建它们的列。你可以这样做:

df2['a4'] = df2['a1']

...等

【讨论】:

以上是关于根据匹配的列标签将行值添加到数据框的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python pandas 根据条件将行值复制到另一列

r 创建将行标记为在两个数据集之间匹配的列

将行值转换为列,其值来自 spark scala 中的另一列 [重复]

熊猫将行值除以聚合总和,条件由其他单元格设置

如何将行值从 iframe 弹出窗口传递到父页面文本框

根据相似的行值创建新列