Как перебрать DF ['column'] со смешанными значениями типов данных? - PullRequest
0 голосов
/ 13 сентября 2018

Я импортировал файл Excel и у меня возникли проблемы с итерацией pandas.После импорта данные выглядят так, как показано ниже.

Acct            Time        Typ     Name   
01/02/2018      NaN         NaN     NaN  
52              07:58:34    1       John  
53              07:58:35    1       Jack   
54              07:58:35    1       Ron  
55              07:58:35    1       Lux   
01/03/2018      NaN         NaN     NaN  
79              12:39:25    1       Mike    
01/06/2018      NaN         NaN     NaN         
371             12:15:47    1       Eric   
422             17:07:33    1       Shawn  
01/07/2018      NaN         NaN     NaN         
492             12:43:54    1       George

Я хочу перебрать строку первого столбца ("Acct"), проверить, является ли она date или число .

Я создал дополнительный столбец в новом фрейме данных и попытался заполнить поле даты, однако получило несколько ошибок Series.

Ожидается вывод, подобный следующему:

Date_New        Acct        Time        Typ     Name 

01/02/2018      52          07:58:34    1       John  
01/02/2018      53          07:58:35    1       Jack   
01/02/2018      54          07:58:35    1       Ron  
01/02/2018      55          07:58:35    1       Lux   
01/03/2018      79          12:39:25    1       Mike    
01/06/2018      371         12:15:47    1       Eric   
01/06/2018      422         17:07:33    1       Shawn  
01/07/2018      492         12:43:54    1       George

Буду признателен, если кто-нибудь сможет выслать мне какое-то направление, поскольку я новичок в pandas.

1 Ответ

0 голосов
/ 13 сентября 2018

Я бы предложил не повторять, а вместо этого использовать pandas функции. Чтобы найти правильные даты, вы можете преобразовать столбец Acct в правильные даты, используя pd.to_datetime, и использовать аргумент errors = 'coerce'. Номера даты будут установлены на ноль (NaT). Затем, вперед, заполните этот столбец правильными датами, используя ffill, и избавьтесь от столбцов, в которых все столбцы Time, Typ и Name являются индексами NaN. Наконец, вы можете изменить порядок столбцов:

# Find proper dates, create new column:
df['Date_New'] = pd.to_datetime(df['Acct'], errors='coerce')
# Fill non-valid dates:
df['Date_New'].ffill(inplace=True)
# Get rid of `NaN` rows:
df = df[~df[['Time','Typ', 'Name']].isnull().all(1)]
# Reorder Columns
df = df[['Date_New', 'Acct', 'Time', 'Typ', 'Name']]

>>> df
     Date_New Acct      Time  Typ    Name
1  2018-01-02   52  07:58:34  1.0    John
2  2018-01-02   53  07:58:35  1.0    Jack
3  2018-01-02   54  07:58:35  1.0     Ron
4  2018-01-02   55  07:58:35  1.0     Lux
6  2018-01-03   79  12:39:25  1.0    Mike
8  2018-01-06  371  12:15:47  1.0    Eric
9  2018-01-06  422  17:07:33  1.0   Shawn
11 2018-01-07  492  12:43:54  1.0  George

Дальнейшее объяснение :

Для облегчения понимания, вот результаты после каждого шага:

>>> df['Date_New'] = pd.to_datetime(df['Acct'], errors='coerce')
>>> df
          Acct      Time  Typ    Name   Date_New
0   01/02/2018       NaN  NaN     NaN 2018-01-02
1           52  07:58:34  1.0    John        NaT
2           53  07:58:35  1.0    Jack        NaT
3           54  07:58:35  1.0     Ron        NaT
4           55  07:58:35  1.0     Lux        NaT
5   01/03/2018       NaN  NaN     NaN 2018-01-03
6           79  12:39:25  1.0    Mike        NaT
7   01/06/2018       NaN  NaN     NaN 2018-01-06
8          371  12:15:47  1.0    Eric        NaT
9          422  17:07:33  1.0   Shawn        NaT
10  01/07/2018       NaN  NaN     NaN 2018-01-07
11         492  12:43:54  1.0  George        NaT

>>> df['Date_New'].ffill(inplace=True)
>>> df
          Acct      Time  Typ    Name   Date_New
0   01/02/2018       NaN  NaN     NaN 2018-01-02
1           52  07:58:34  1.0    John 2018-01-02
2           53  07:58:35  1.0    Jack 2018-01-02
3           54  07:58:35  1.0     Ron 2018-01-02
4           55  07:58:35  1.0     Lux 2018-01-02
5   01/03/2018       NaN  NaN     NaN 2018-01-03
6           79  12:39:25  1.0    Mike 2018-01-03
7   01/06/2018       NaN  NaN     NaN 2018-01-06
8          371  12:15:47  1.0    Eric 2018-01-06
9          422  17:07:33  1.0   Shawn 2018-01-06
10  01/07/2018       NaN  NaN     NaN 2018-01-07
11         492  12:43:54  1.0  George 2018-01-07

>>> df = df[~df[['Time','Typ', 'Name']].isnull().all(1)]
>>> df
   Acct      Time  Typ    Name   Date_New
1    52  07:58:34  1.0    John 2018-01-02
2    53  07:58:35  1.0    Jack 2018-01-02
3    54  07:58:35  1.0     Ron 2018-01-02
4    55  07:58:35  1.0     Lux 2018-01-02
6    79  12:39:25  1.0    Mike 2018-01-03
8   371  12:15:47  1.0    Eric 2018-01-06
9   422  17:07:33  1.0   Shawn 2018-01-06
11  492  12:43:54  1.0  George 2018-01-07
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...