pandas 按行的条件 Dataframe 操作

syqv5f0l  于 2022-12-28  发布在  其他
关注(0)|答案(3)|浏览(126)

假设我有一个df

我想要一个像这样的df

在python或R中我该怎么做呢?这在excel中很容易,只需要一个简单的if语句,例如:c5 =IF(c2 =“X”,“ccc”,c4)。
我原以为这在R中也很简单,但我尝试了df〈- df %〉% mutate(c4 = ifelse(c2 = 'X',paste(c3,c3,c3),c4)),它用NA填充了所有其他值:

为什么会发生这种情况,我该如何解决?
理想的情况下,我希望在python中实现,我已经尝试了dfply的mutate和ifelse,类似于上面的,并且使用了panda的loc函数,但是都不起作用。
这感觉应该很简单--有什么明显的东西我漏掉了吗?

hfyxw5xn

hfyxw5xn1#

我们可能需要R中的strrep

library(dplyr)
df %>%
   mutate(c4 = ifelse(c2 %in% "X", strrep(c3, nchar(c4)), c4))
  • 输出
id c2 c3  c4
1  1     a aaa
2  2     b bbb
3  3  X  c ccc

数据

df <- structure(list(id = 1:3, c2 = c("", "", "X"), c3 = c("a", "b", 
"c"), c4 = c("aaa", "bbb", "zzz")), class = "data.frame", row.names = c(NA, 
-3L))
d8tt03nd

d8tt03nd2#

df.c4.where(df.c2.ne("X"), other=df.c3 * 3)

这读起来像
"对于c4列:* 其中 * c2值 * n * or * e * 等于"X",保持原样;否则,放入重复3次的c3值"。
运行示例:

In [182]: df
Out[182]:
   id c2 c3   c4
0   1     a  aaa
1   2     b  bbb
2   3  X  c  zzz

In [183]: df.c4 = df.c4.where(df.c2.ne("X"), other=df.c3 * 3)

In [184]: df
Out[184]:
   id c2 c3   c4
0   1     a  aaa
1   2     b  bbb
2   3  X  c  ccc
j13ufse2

j13ufse23#

我想你可以在Pandas身上做:

m = df['c2'] == 'X'
df.loc[m, 'c4'] = df.loc[m, 'c3'].str.repeat(3)

查找“c2”为“X”的行并找到“c3”列,重复此操作3次,然后使用.loc就地修改“c4”列

相关问题