Разделение столбца в фрейме данных pandas без удаления na

#python #pandas #csv

#python #pandas #csv

Вопрос:

Я собираюсь предварить этот вопрос, сказав, что я не владею тем, как данные начинаются в csv. У меня также нет прямого доступа к csv, поскольку я могу извлечь его только из SFTP, к которому у меня нет прямого доступа. API отображает тот же формат данных, что и csv. Вот два столбца входящего csv в фрейм данных, которые имеют отношение к делу.

  ----- ------------------------------- ------------- 
|     |  Sourcing Event ID (DTRM ID)  |     Site    |
 ----- ------------------------------- ------------- 
| 0   |                         1035  |     ,ABC55, |
| 1   |                         1067  |          ,, |
| 2   |                         1181  |          ,, |
| 3   |                         1183  |          ,, |
| 4   |                         1184  |          ,, |
| 5   |                         1264  |          ,, |
| 6   |                         1307  |      ,DEF2, |
| 7   |                         1354  |          ,, |
| 8   |                         1369  |    ,HIJ150, |
| 9   |                         1372  |     ,DEF64, |
| 10  |                         1373  |      ,KLM9, |
| 11  |                         1374  |      ,DEF1, |
| 12  |                         1381  |          ,, |
| 13  |                         1385  |          ,, |
| 14  |                         1391  |          ,, |
| 15  |                         1394  |          ,, |
| 16  |                         1395  |          ,, |
| 17  |                         1402  |          ,, |
| 18  |                         1404  |          ,, |
| 19  |                         1405  |          ,, |
| 20  |                         1406  |          ,, |
| 21  |                         1408  |          ,, |
| 22  |                         1410  |    ,HIJ116, |
| 23  |                         1412  |          ,, |
 ----- ------------------------------- ------------- 
 

исходя из этого, я делаю следующее (из предыдущего ответа SO) :

 df_sourcing_events = pd.read_csv(wf['local_filename'])


            sourcing_events_melt_col = 'Sourcing Event ID (DTRM ID)'
            sourcing_events_site_col = 'Site'
            print(df_sourcing_events[[sourcing_events_melt_col,sourcing_events_site_col]])
            df_sourcing_events[sourcing_events_site_col] = df_sourcing_events[sourcing_events_site_col].str.lstrip(',')
            df_sourcing_events[sourcing_events_site_col] = df_sourcing_events[sourcing_events_site_col].str.rstrip(',')

            df_sourcing_events_sites = pd.concat([df_sourcing_events[sourcing_events_melt_col], df_sourcing_events[sourcing_events_site_col].str.split(',', expand = True)], axis = 1)
                                                    .melt(id_vars=[sourcing_events_melt_col])
                                                    .sort_values(by = sourcing_events_melt_col)
                                                    .rename(columns = {'value' : sourcing_events_site_col})
                                                    .drop(columns = ['variable'])
                                                    .dropna()
 

теперь вы спрашиваете себя, зачем разделять начальные и конечные запятые?

ну, потому что у меня есть другой файл, связанный с контрактами, который имеет тот же точный макет, и я сделал с ним то же самое, и это решило проблему с тем же точным кодом. Я ни за что на свете не могу понять, почему результат моего кода следующий:

  ----- ------------------------------- ----------- 
|     |  Sourcing Event ID (DTRM ID)  |    Site   |
 ----- ------------------------------- ----------- 
| 0   |                         1035  |     ABC55 |
| 1   |                         1067  |           |
| 2   |                         1181  |           |
| 3   |                         1183  |           |
| 4   |                         1184  |           |
| 5   |                         1264  |           |
| 6   |                         1307  |      DEF2 |
| 7   |                         1354  |           |
| 8   |                         1369  |    HIJ150 |
| 9   |                         1372  |     DEF64 |
| 10  |                         1373  |      KLM9 |
| 11  |                         1374  |      DEF1 |
| 12  |                         1381  |           |
| 13  |                         1385  |           |
| 14  |                         1391  |           |
| 15  |                         1394  |           |
| 16  |                         1395  |           |
| 17  |                         1402  |           |
| 18  |                         1404  |           |
| 19  |                         1405  |           |
| 20  |                         1406  |           |
| 21  |                         1408  |           |
| 22  |                         1410  |    HIJ116 |
| 23  |                         1412  |           |
 ----- ------------------------------- ----------- 
 

похоже, что dropna() просто не работает вообще. Я даже скопировал и вставил рабочий код из других контрактов csv в эту область и просто изменил переменные в коде, чтобы они соответствовали этому csv, и он все еще не работает. Я перепроверил, чтобы убедиться, что другой код действительно работает.

Я .dropna(how='any') пытался безрезультатно. Что еще мне делать?

Редактировать:

Ответ человеку Zack:

Нет, потому что после этого я делаю следующее:

 df_sourcing_events_final = df_sourcing_events.drop([sourcing_events_site_col], axis=1)

            write_dataframe_to_csv_on_s3(df_sourcing_events_sites, s3_bucket, 'sourcing_events_sites.csv')

            write_dataframe_to_csv_on_s3(df_sourcing_events_final, s3_bucket, file_name)
 

Я разбиваю столбец, представляющий собой список, на отдельные строки и создаю из него новый csv для загрузки в отдельную таблицу.

Комментарии:

1. Вы сохраняете конечное значение в df_sourcing_events_sites , должно ли оно быть df_sourcing_events вместо этого?

Ответ №1:

Это не отбрасывается, потому что это пустые строки, а не N / A. Попробуйте:

 df = df_sourcing_events_sites
df = df[df.Site != '']
 

Комментарии:

1. Я понятия не имею, почему он работает на этом, а другой с тем же макетом работает по-разному. Изначально я пробовал это с контрактами, и это не сработало. Я полагаю, это то, что я получаю, думая, что они одинаковы.

Ответ №2:

dropna() отбрасывает только «реальный» NaN . Но иногда файлы csv содержат na, которые Pandas рассматривает как строку. В вашем случае я думаю , что это пустые строки "" .

В любом случае read_csv метод имеет na_values параметр, который вы можете заполнить желаемыми строковыми значениями. Вы можете попробовать na_values="" , но я не могу предсказать результат этого.