1

我正在使用包 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 上执行此操作的包?

谢谢 !!

4

1 回答 1

0

如果您只有 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。一般来说,这应该不是问题。

于 2018-08-13T13:24:25.587 回答