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

根据来自其他数据帧的多行替换数据帧中的值

家西岭
2023-03-14

我有3个数据帧。第一数据帧(例如df1)具有多行和多列。第二和第三数据帧(例如df2和df3)仅具有来自DF1的一行和列的子集。df2和df3中的列名相同。所以我要做的是将df1中的每一行与df2和DF3中的单行进行比较。如果来自df1的单元格的值与df2的单元格内容匹配,则将df1中单元格的值替换为1;如果来自df1的单元格的值与df3匹配,则将df1中单元格的值替换为2;如果df2的单元格内容与df2或df3都不匹配,则将df1中单元格的值替换为-。我编写了一个循环来完成这个操作,但它很慢。我想知道有没有什么优化的方法可以做到这一点。谢谢你。

以下是示例数据帧和预期输出:

df1
c1  c2  c3  c4  c5  c6  c7  c8  c9  c10 c11 c12
 q  w   e   r   t   y   q   w   e   r   t   y
 q  e   r   t   y   q   e   r   e   r   t   y
 w  e   r   t   y   t   q   w   e   r   w   t

df2
                c5  c6  c7  c8  c9  c10 c11 c12
                t   y   q   w   e   t   w   t

df3             
                c5  c6  c7  c8  c9  c10 c11 c12
                y   q   q   t   e   r   t   t

Expected output:                
c1  c2  c3  c4  c5  c6  c7  c8  c9  c10 c11 c12
q   w   e   r   1   1   1   1   1   2   2   -
q   e   r   t   2   2   -   -   1   2   2   -
w   e   r   t   2   -   1   1   1   2   1   1

共有1个答案

关志勇
2023-03-14

我们可以使用intersect找到常用列。重复DF2DF3行,并将它们与DF1进行比较,将DF1中的匹配值替换为1,将DF2中的匹配值替换为2,并将所有其他值替换为“-”

cols <- intersect(names(df1), names(df2))
df1[cols][df1[cols] == df2[rep(seq_len(nrow(df2)), nrow(df1)), ]] <- 1
df1[cols][df1[cols] == df3[rep(seq_len(nrow(df3)), nrow(df1)), ]] <- 2
df1[cols][(df1[cols] != 1) & (df1[cols] != 2)] <- "-"


df1
#  c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12
#1  q  w  e  r  1  1  1  1  1   2   2   -
#2  q  e  r  t  2  2  -  -  1   2   2   -
#3  w  e  r  t  2  -  1  1  1   2   1   1

根据注释,如果我们希望填充DF1中的剩余值,而DF2DF3中没有这些值,我们可以找出不匹配的索引,并使用paste0将值粘贴在一起。

temp_df2 <- df2[rep(seq_len(nrow(df2)), nrow(df1)), ]
temp_df3 <- df3[rep(seq_len(nrow(df2)), nrow(df1)), ]
df1[cols][df1[cols] == temp_df2] <- 1
df1[cols][df1[cols] == temp_df3] <- 2
inds <- (df1[cols] != 1) & (df1[cols] != 2)
df1[cols][inds] <- paste0(df1[cols][inds], temp_df2[inds], temp_df3[inds])

df1
#  c1 c2 c3 c4 c5  c6  c7  c8 c9 c10 c11 c12
#1  q  w  e  r  1   1   1   1  1   2   2 ytt
#2  q  e  r  t  2   2 eqq rwt  1   2   2 ytt
#3  w  e  r  t  2 tyq   1   1  1   2   1   1
 类似资料:
  • 我有两个data.frames,每个都有数千行和几十列,都是通过合并几个csv文件创建的。data.frames正是我想要的。我还要补充一点,df1和df2有几列是共同的。唯一的问题是,在其中一个中,比如df1,对于某些列,有一些NAs(这是预期的/正常的)。好的一面是,我有NAs的相同列也出现在第二data.frame,比如df2,但没有NAs。我想做的是用df1同一列的值填充df2给定列中的N

  • 我有两个数据帧df1和df2。df1就像一个具有以下值的字典 df2具有以下值: 我想基于df1数据帧中的,将df2拆分为3个新的数据帧。 日期,TLRA_权益栏应位于数据框 预期产出: > 数据帧 消费者,非周期性数据帧 请让我知道如何有效地做。我想做的是连接列名,例如,然后根据列名的前半部分分割数据帧。 代码: 但这很复杂。需要更好的解决方案。

  • 我有一个熊猫的数据框架,看起来像这样: 当列名是从15到159的A时,我想替换pr行名的值。我如何使用熊猫在Python中做到这一点?

  • 我想更改我的熊猫数据框架中的一个值,我想我误解了索引的工作方式。 我得到输出 我想将df中的值0.665873更改为1。我试过了 但我得到了错误 我试图用示例数据帧复制该问题,但无济于事。 我认为问题在于,当我使用实际数据时,我得到了一系列的输出,但当我使用实践数据时,得到了一个浮点。为什么我得到的是这个系列而不是浮点0.665873?

  • 我有两个熊猫数据框 步骤2:对于flag=1的行,AA_new将计算为var1(来自df2)*组“A”和val“AA”的df1的'cal1'值*组“A”和val“AA”的df1的'cal2'值,类似地,AB_new将计算为var1(来自df2)*组“A”和val“AB”的df1的'cal1'值*组“A”和val“AB”的df1的'cal2'值 我的预期输出如下所示: 以下基于其他stackflow

  • 我和Spark一起在Databricks上工作。编程语言是Scala。 我有两个数据帧: 主数据框:见截图:1 查找数据帧:参见屏幕截图3 我想: 查找主数据框中“年龄”=-1的所有行 我对如何做这件事伤了脑筋。我唯一想到的是将dataframe存储为DataRicks中的表,并使用SQL语句(SQL.Context.SQL…),结果非常复杂。 我想知道是否有更有效的方法。 编辑:添加可复制的示例