下面是我的数据框。
如果'a'是NA,我需要根据日期可用性从日期中减去日期c / d,我需要从'b'中选择值,并且c和d也是如此。如果'c'是NA,则需要从'd'中选择值。我需要包含差异的列“ e”。
如何遍历每一行并执行这种减法?
答案 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