Pythonic способ обработки кода Python для обработки столбцов NAN и NAT - PullRequest
1 голос
/ 01 июня 2019

У меня большой набор данных с несколькими столбцами, в каждом из этих столбцов есть 4 отдельных столбца.

Для простоты столбцы в Dataframe - это US.A, US.B, US.C, BR.A, BR.B, BR.C Теперь, если столбец US.B только пустой, тогда заполните все столбцы, связанные с США, «-» аналогично, если BR.B пуст, то заполните столбцы, связанные с BR, «-».

Для этого я использую Python 3 и pandas. Я создал код для его запуска, но не особо доволен тем, как он выглядит, и подумал, есть ли более простой способ решения этой проблемы.

import pandas as pd

###Splitting the data set

df1 = df.drop(['D','E','F'], axis=1)
df2 = df.drop(['A', 'B','C'], axis=1)


###Now I tackle them individually

df1 = df1.astype(str)
df1 = df1[df1['US.B'].isnull()]
df1 = df1f.fillna(value="-")

df2 = df2.astype(str)
df2 = df2[df2['BR.B'].isnull()]
df2 = df2.fillna(value="-")

merge = pd.concat([df1, df2])

Теперь причина, по которой я преобразую DataFrame в строку, заключается в том, что по какой-то причине столбцы с датой «Nat» доставляют мне проблемы во время заполнения. Теперь это выглядит аккуратно, но я имею дело с огромным набором данных, и это повторяется несколько раз для достижения результата.

Данные:

1   US.A    US.B    US.C      BR.A     BR.B    BR.C
2   Foo     123  01-01-2018     Foo     324     03-05-2017
3   Bar     124  02-01-2018     Bar     325     04-05-2017
4   Foo     125  03-01-2018                         
5   Bar     126  04-01-2018     Bar     327     06-05-2017
6                               Foo     328     07-05-2017
7   Bar     128  06-01-2018     Bar     400     08-05-2017
8           100  07-01-2018     Foo     330     

Результат:

1   US.A    US.B    US.C      BR.A     BR.B    BR.C
2   Foo     123  01-01-2018     Foo     324     03-05-2017
3   Bar     124  02-01-2018     Bar     325     04-05-2017
4   Foo     125  03-01-2018      -       -          -
5   Bar     126  04-01-2018     Bar     327     06-05-2017
6   -        -     -            Foo     328     07-05-2017
7   Bar     128  06-01-2018     Bar     400     08-05-2017
8           100  07-01-2018     Foo     330     

1 Ответ

1 голос
/ 01 июня 2019

Вы можете попробовать следующий подход:

df_US=df.filter(like='US')
df_BR=df.filter(like='BR')

pd.concat([df_US.mask(df_US['US.B'].isna(),'-'),df_BR.mask(df_BR['BR.B'].isna(),'-')],axis=1)

  US.A US.B                 US.C BR.A BR.B                 BR.C
0  Foo  123  2018-01-01 00:00:00  Foo  324  2017-05-03 00:00:00
1  Bar  124  2018-01-02 00:00:00  Bar  325  2017-05-04 00:00:00
2  Foo  125  2018-01-03 00:00:00    -    -                    -
3  Bar  126  2018-01-04 00:00:00  Bar  327  2017-05-06 00:00:00
4    -    -                    -  Foo  328  2017-05-07 00:00:00
5  Bar  128  2018-01-06 00:00:00  Bar  400  2017-05-08 00:00:00
6  NaN  100  2018-01-07 00:00:00  Foo  330                  NaT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...