Запись столбца pandas в csv без объединения целых чисел

#python #pandas #dataframe #csv

Вопрос:

Я извлек идентификатор пользователя из shop_ids как фрейм данных pandas из базы данных с помощью SQL-запроса.

     user_id     shop_ids
0   022221205   541
1   023093087   5088,4460,4460,4460,4460,4460,4460,4460,5090
2   023096023   2053,2053,2053,2053,2053,2053,2053,2053,2053,1...
3   023096446   4339,4339,3966,4339,4339
4   023098684   5004,3604,5004,5749,5004
 

Я пытаюсь записать этот фрейм данных в csv с помощью:
df.to_csv('users_ordered_shops.csv')

В итоге я получаю csv, объединяющий идентификаторы магазинов в один номер как таковой:

     user_id     shop_ids
0   22221205    541
1   23093087    508,844,604,460,446,000,000,000,000,000,000,000
2   23096023    2,053,205,320,532,050,000,000,000,000,000,000,000,000,000,000,000,000
3   23096446    43,394,339,396,643,300,000
4   23098684    50,043,604,500,457,400,000
 

Значения индекса 2 являются:

 print(df.iloc[2].shop_ids)
2053,2053,2053,2053,2053,2053,2053,2053,2053,1294,1294,2053,1922
 

Ожидаемый результат-файл csv со всеми сохраненными идентификаторами shop_id в одном столбце или в разных столбцах, таких как:

     user_id     shop_ids
0   022221205   541
1   023093087   5088,4460,4460,4460,4460,4460,4460,4460,5090
2   023096023   2053,2053,2053,2053,2053,2053,2053,2053,2053,1294,1294,2053,1922
3   023096446   4339,4339,3966,4339,4339
4   023098684   5004,3604,5004,5749,5004
 

Какие-нибудь советы о том, как получить идентификаторы магазинов без слияния при записи в csv-файл? Я попытался преобразовать столбец shop_ids с помощью astype() в int и str , что привело к тому же результату.

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

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

2. Спасибо @Corralien. Просто отредактировал изображения в текст.

3. Каков ваш ожидаемый результат? Например, для индекса 2

4. Ожидаемым результатом будет файл csv, который не потеряет идентификаторы магазинов и не объединит идентификаторы магазинов в одно длинное число при преобразовании в csv.

5. Вам нужно показать, какой код вы используете. Я не могу понять, как вы меняете 4-значные числа на 3-значные. Похоже, вы объединяете числовые строки или берете строку и удаляете запятые вручную.

Ответ №1:

Обновить

Чтобы получить по одному магазину на колонку (и удалить дубликаты), вы можете использовать:

 pd.concat([df['user_id'],
           df['shop_ids'].apply(lambda x: sorted(set(x.split(','))))
                         .apply(pd.Series)],
          axis=1).to_csv('users_ordered_shops.csv', index=False)
 

Измените разделитель. Попробуй:

 df.to_csv('users_ordered_shops.csv', sep=';')
 

Или измените стратегию цитирования:

 import csv

df.to_csv('users_ordered_shops.csv', quoting=csv.QUOTE_NONNUMERIC)
 

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

1. Изменение разделителя разделяет большинство значений, но объединяет значение user_id и значение first shop_id вместе. Изменение стратегии котировки не приводит к изменению результатов.

2. Попробуй: pd.concat([df['user_id'], df['shop_ids'].apply(lambda x: sorted(set(x.split(',')))).apply(pd.Series)], axis=1).to_csv('data.csv', index=False)

3. @ Corralien это сработало для меня! Он получил уникальные значения в разных столбцах. Не могли бы вы добавить это в свой ответ, чтобы я мог его принять.

4. @afs. Я обновил свой ответ. Спасибо 🙂

5. Здорово. спасибо за помощь!