根据数据可用性从不同的列中减去两个日期

时间:2018-11-19 01:04:23

标签: python dataframe

下面是我的数据框。

enter image description here

如果'a'是NA,我需要根据日期可用性从日期中减去日期c / d,我需要从'b'中选择值,并且c和d也是如此。如果'c'是NA,则需要从'd'中选择值。我需要包含差异的列“ e”。

如何遍历每一行并执行这种减法?

1 个答案:

答案 0 :(得分:0)

按照我的逻辑,大多数时间里,最简单的方法就是创建中间列。最终,如果您不希望它们,可以将其删除或对其进行优化。但这是封装逻辑的一种简便方法。您要做的是采用这样的数据框:

@attribute class {yes, no}

@data
yes, "This is a road block"

,并创建一些中间列,当它们不是>>> df a b c d 0 0.414762 0.113796 0.134529 NaN 1 NaN 0.662192 0.703417 NaN 2 0.958970 NaN 0.237540 NaN 3 0.975512 0.241572 NaN 0.720148 4 0.719265 0.735744 0.801279 NaN 时,它们的值是df['a'],否则用NaN的值填充。您可以使用df.fillna()轻松完成此操作;您可以使用它用另一列中的值填充df['b']值。然后,您可以仅采用这两列的区别。例如:

NaN

这是假设缺少的值为>>> df['a_or_b'] = df['a'].fillna(df['b']) >>> df['c_or_d'] = df['c'].fillna(df['d']) >>> df['e'] = df['a_or_b'] - df['c_or_d'] >>> df a b c d a_or_b c_or_d e 0 0.414762 0.113796 0.134529 NaN 0.414762 0.134529 0.280233 1 NaN 0.662192 0.703417 NaN 0.662192 0.703417 -0.041225 2 0.958970 NaN 0.237540 NaN 0.958970 0.237540 0.721430 3 0.975512 0.241572 NaN 0.720148 0.975512 0.720148 0.255364 4 0.719265 0.735744 0.801279 NaN 0.719265 0.801279 -0.082013 ,而您的值为NaN。您也可以通过相同的方式使用df.replace()替换字符串的值:

N/A

尽管我建议不要使用字符串,但在使用它们时应使用实际的空类型值,例如>>> df a b c d 0 0.414762 0.113796 0.134529 N/A 1 N/A 0.662192 0.703417 N/A 2 0.95897 N/A 0.23754 N/A 3 0.975512 0.241572 N/A 0.720148 4 0.719265 0.735744 0.801279 N/A >>> df['a_or_b'] = df['a'].replace('N/A', df['b']) >>> df['c_or_d'] = df['c'].replace('N/A', df['d']) >>> df['e'] = df['a_or_b'] - df['c_or_d'] >>> df a b c d a_or_b c_or_d e 0 0.414762 0.113796 0.134529 N/A 0.414762 0.134529 0.280233 1 N/A 0.662192 0.703417 N/A 0.662192 0.703417 -0.041225 2 0.95897 N/A 0.23754 N/A 0.958970 0.237540 0.721430 3 0.975512 0.241572 N/A 0.720148 0.975512 0.720148 0.255364 4 0.719265 0.735744 0.801279 N/A 0.719265 0.801279 -0.082013 NaN)或np.nan,而不要使用{{ 1}}。


无论哪种方式,现在您都知道中间列是什么---因此,您可以直接使用这些结果,而不是如果不需要的话,可以将它们实际分配给数据框。

None