我有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
我们可以使用intersect
找到常用列。重复DF2
和DF3
行,并将它们与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
中的剩余值,而DF2
和DF3
中没有这些值,我们可以找出不匹配的索引,并使用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…),结果非常复杂。 我想知道是否有更有效的方法。 编辑:添加可复制的示例