如何使用df.loc(或其他一些方法)根据特定条件创建新列?

我有一个包含 5 列的数据框,我正在使用 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
6  2006-08-29        NaT 2013-08-29 2013-08-292

我想创建另一个列来计算每个 id 出现的“calv”的数量。但是,如果其他值之间存在缺失值,这对我来说很重要,请参阅第 6 行。然后我希望有一个 NaN 或其他一些值,表明这不是正确的行。

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

这是我的最后一次尝试:

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 NaT 值是什么的方法?

对新 Python 用户有什么提示和技巧吗?我已经在 SAS 和 Fortran 中使用 if 和 elseif 语句完成了此操作,但我正在尝试找到在 Python 中执行此操作的最佳方法。

编辑:
我真的很想知道这是否可以通过 if 或 ifelse 语句来完成。

现在我也在想我希望能够在数据框中包含其他列,这些列包含额外的信息,但对于这个确切的目的不需要。一个例子(一个添加的 yx 列):

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

以上是如何使用df.loc(或其他一些方法)根据特定条件创建新列?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>