Вычтите две даты из разных столбцов в зависимости от доступности данных - PullRequest
0 голосов
/ 19 ноября 2018

Ниже мой фрейм данных.

введите описание изображения здесь

Мне нужно вычесть даты c / d из a / b на основе доступности даты, если 'a 'это NA, мне нужно выбрать значение из' b ', и то же самое касается c и d.Если 'c' - это NA, мне нужно выбрать значение из 'd'.Мне нужен столбец «е», содержащий разницу.

Как перебрать каждую строку и выполнить такое вычитание?

1 Ответ

0 голосов
/ 19 ноября 2018

Следуя логике в моем комментарии, самое простое, что можно сделать с Пандами - это создать промежуточные столбцы.В конце концов вы можете удалить их или оптимизировать их, если вы не хотите их.Но это простой способ инкапсулировать вашу логику.Что вы хотите сделать, это взять фрейм данных, подобный следующему:

>>> 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['b'].Вы можете сделать это с помощью df.fillna() довольно легко;Вы можете использовать его для заполнения значений 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, а ваши N/A.Вы также можете использовать df.replace() таким же образом, чтобы заменить значение строк:

>>> 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) или None вместо строки типа 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['e'] = df['a'].replace('N/A', df['b']) - df['c'].replace('N/A', df['d'])
>>> df
          a         b         c         d         e
0  0.414762  0.113796  0.134529       N/A  0.280233
1       N/A  0.662192  0.703417       N/A -0.041225
2   0.95897       N/A   0.23754       N/A  0.721430
3  0.975512  0.241572       N/A  0.720148  0.255364
4  0.719265  0.735744  0.801279       N/A -0.082013
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...