Python和pandas:如何使用df.loc根据条件创建新列?

2024-09-26 22:55:34 发布

您现在位置:Python中文网/ 问答频道 /正文

*见下文编辑

我有一个包含6列的数据框架,我正在使用pandas和numpy来编辑和处理数据

id      calv1      calv2      calv3      calv4 
1  2006-08-29 2007-08-29 2008-08-29 2009-08-29
2         NaT        NaT        NaT        NaT         
3  2006-08-29        NaT        NaT        NaT
4  2006-08-29 2007-08-29 2010-08-29        NaT
5  2006-08-29 2013-08-29        NaT        NaT

我想创建另一列,计算每个id出现的“calv”数

id      calv1      calv2      calv3      calv4 no_calv
1  2006-08-29 2007-08-29 2008-08-29 2009-08-29       4
2         NaT        NaT        NaT        NaT       0 
3  2006-08-29        NaT        NaT        NaT       1
4  2006-08-29 2007-08-29 2010-08-29        NaT       3
5  2006-08-29 2013-08-29        NaT        NaT       2

这是我最后一次尝试:

nat = np.datetime64('NaT')

df.loc[
(df["calv1"] == nat) & (df["calv2"] == nat) &
(df["calv3"] == nat) & (df["calv4"] == nat),
"no_calv"] = 0
#1 calvings
df.loc[
(df["calv1"] != nat) & (df["calv2"] == nat) &
(df["calv3"] == nat) & (df["calv4"] == nat),
"no_calv"] = 1
#2 calvings
df.loc[
(df["calv1"] != nat) & (df["calv2"] != nat) &
(df["calv3"] == nat) & (df["calv4"] == nat),
"no_calv"] = 2
#3 calvings
df.loc[
(df["calv1"] != nat) & (df["calv2"] != nat) &
(df["calv3"] != nat) & (df["calv4"] == nat),
"no_calv"] = 3
#4 or more calvings
df.loc[
(df["calv1"] != nat) & (df["calv2"] != nat) &
(df["calv3"] != nat) & (df["calv4"] != nat),
"no_calv"] = 4

但结果是整个“no_calv”列4.0

我以前试过这样的方法

..
(df["calv1"] != "NaT")
..

..
(df["calv1"] != pd.nat)
..

整个列的结果总是4.0,或者只是NaN.

对于新的python用户有什么提示和技巧吗

*编辑: 我得到了一个很好的答案,仅仅是计算总和,但我现在意识到,如果其他值之间缺少值,我还想考虑一个因素(参见第6行):

id      calv1      calv2      calv3      calv4 no_calv
1  2006-08-29 2007-08-29 2008-08-29 2009-08-29       4
2         NaT        NaT        NaT        NaT       0 
3  2006-08-29        NaT        NaT        NaT       1
4  2006-08-29 2007-08-29 2010-08-29        NaT       3
5  2006-08-29 2013-08-29        NaT        NaT       2
6  2006-08-29        NaT 2013-08-29 2013-08-292     NaN #or some other value

这就是为什么我试图在我的原始示例中非常清楚地说明标准


Tags: or数据noid编辑dfnatloc
2条回答

只要值是datetime(NaT是缺少的值,而不是字符串),您就可以使用:

df['no_calv'] = df.notna().sum(axis = 1)

要获得:

id      calv1      calv2      calv3      calv4 no_calv
1  2006-08-29 2007-08-29 2008-08-29 2009-08-29       4
2         NaT        NaT        NaT        NaT       0 
3  2006-08-29        NaT        NaT        NaT       1
4  2006-08-29 2007-08-29 2010-08-29        NaT       3
5  2006-08-29 2013-08-29        NaT        NaT       2

它会检查是否存在未丢失的值,并沿行(轴=1)求和

您可以使用apply执行此操作:

 def counting_fun(row):
     return len(row.dropna()) # what is the cnt of not pd.nat columns

 df['no_calv'] = df.apply(counting_fun, axis=1)

相关问题 更多 >

    热门问题