#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=""
, но я не могу предсказать результат этого.