【问题标题】:How to use conditionnal statement with startswith() on Python - dfply?如何在 Python 中使用带有startswith() 的条件语句 - dfply?
【发布时间】:2018-08-13 12:45:36
【问题描述】:

我正在使用包 dfply 在 Python 上进行数据整理。

我想从数据集data_a的'FC06'创建一个新变量“a06”,这样:

  • a06 = 1 如果 FC06[i] 以字符“1”开头(例如:FC06[i]=173)
  • a06 = 2 如果 FC06[i] 以字符“2”开头
  • a06 = NaN 如果 FC06[i] = NaN

例如,输入:

df = pd.DataFrame({'FC06':[173,170,220,float('nan'),110,230,float('nan')]})

我想得到输出:

df1= pd.DataFrame({'a06':[1,1,2,float('nan'),1,2,float('nan')]})

在 R 上,它将通过以下方式获得:

data_a %>% mutate(a06 = ifelse(substr(FC06,1,1)=="1",1,ifelse(substr(FC06,1,1)=="1",2,NaN)))

但我不知道如何用 Python 做到这一点。

我实现了第一个版本,只有 2 个选项:NaN 或 1,带有:

data_a >>        mutate(a06=if_else((X['FC06'].apply(pd.isnull)),float('nan'),1)

但是我找不到如何根据FC06的第一个字符来区分结果。

(我尝试过类似的东西:

(data_a >> mutate(a06=if_else(X['FC06'].apply(pd.isnull),float('nan'),if_else(X['FC06'].apply(str)[0]=='1',1,2))))

但没有成功: - [0] 无法获取第一个字符 - 和/或 str() 不能与 apply 一起使用(str.startswith('1') 都不是)

有人知道如何解决这种情况吗?

或者在 Python 上使用另一个包?

谢谢!!

【问题讨论】:

  • 您能否提供一些示例数据和您的预期输出? Here 是一些关于如何制作好的、可重现的 pandas 示例的技巧。
  • 好的,例如,我的输入可以是:df = pd.DataFrame({'FC06':[173,170,220,float('nan'),110,230,float('nan')]})
  • 和预期的输出:df1= pd.DataFrame({'a06':[1,1,2,float('nan'),1,2,float('nan')]} )
  • edit您的问题并在那里提供这些示例。
  • 注意,您的示例提供整数,而不是字符串...它们是什么?

标签: python pandas apply dplyr dfply


【解决方案1】:

如果你只有 3 位数字,你可以使用楼层划分:

df['FC06'] //= 100

如果有字符串,可以使用pd.Series.mask:

ints = pd.to_numeric(df['FC06'].astype(str).str[:1], errors='coerce')
df['FC06'].mask(df['FC06'].notnull(), ints, inplace=True)

print(df)

   FC06
0   1.0
1   1.0
2   2.0
3   NaN
4   1.0
5   2.0
6   NaN

你会注意到你的整数变成了浮点数。这是由NaN 值的存在所强制的,这些值被认为是float。一般来说,这应该不是问题。

【讨论】:

  • 谢谢!我会尝试使用 dfply (或 R 中的 dplyr 等效项),但只要它有效,它就非常好:)
猜你喜欢
  • 1970-01-01
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
  • 2021-01-27
  • 1970-01-01
  • 2014-04-25
  • 2023-04-05
  • 2016-08-11
相关资源
最近更新 更多