#python #pandas
#python #pandas
Вопрос:
У меня проблема с добавлением фрейма данных. Я пытаюсь выполнить этот код
df_all = pd.read_csv('data.csv', error_bad_lines=False, chunksize=1000000)
urls = pd.read_excel('url_june.xlsx')
substr = urls.url.values.tolist()
df_res = pd.DataFrame()
for df in df_all:
for i in substr:
res = df[df['url'].str.contains(i)]
df_res.append(res)
И когда я пытаюсь сохранить df_res
, я получаю пустой фрейм данных.
df_all
выглядит так
ID,"url","used_at","active_seconds"
b20f9412f914ad83b6611d69dbe3b2b4,"mobiguru.ru/phones/apple/comp/32gb/apple_iphone_5s.html",2015-10-01 00:00:25,1
b20f9412f914ad83b6611d69dbe3b2b4,"mobiguru.ru/phones/apple/comp/32gb/apple_iphone_5s.html",2015-10-01 00:00:31,30
f85ce4b2f8787d48edc8612b2ccaca83,"4pda.ru/forum/index.php?showtopic=634566amp;view=getnewpost",2015-10-01 00:01:49,2
d3b0ef7d85dbb4dbb75e8a5950bad225,"shop.mts.ru/smartfony/mts/smartfon-smart-sprint-4g-sim-lock-white.html?utm_source=admitadamp;utm_medium=cpaamp;utm_content=300amp;utm_campaign=gde_cpaamp;uid=3",2015-10-01 00:03:19,34
078d388438ebf1d4142808f58fb66c87,"market.yandex.ru/product/12675734/spec?hid=91491amp;track=char",2015-10-01 00:03:48,2
d3b0ef7d85dbb4dbb75e8a5950bad225,"avito.ru/yoshkar-ola/telefony/mts",2015-10-01 00:04:21,4
d3b0ef7d85dbb4dbb75e8a5950bad225,"shoppingcart.aliexpress.com/order/confirm_order",2015-10-01 00:04:25,1
d3b0ef7d85dbb4dbb75e8a5950bad225,"shoppingcart.aliexpress.com/order/confirm_order",2015-10-01 00:04:26,9
и urls
выглядит так
url
shoppingcart.aliexpress.com/order/confirm_order
ozon.ru/?context=order_doneamp;number=
lk.wildberries.ru/basket/orderconfirmed
lamoda.ru/checkout/onepage/success/quick
mvideo.ru/confirmation?_requestid=
eldorado.ru/personal/order.php?step=confirm
Когда я печатаю res
в цикле, он не опустошается. Но когда я пытаюсь выполнить печать в цикле df_res
после добавления, он возвращает пустой фрейм данных.
Я не могу найти свою ошибку. Как я могу это исправить?
Ответ №1:
Если вы посмотрите на документацию для pd.DataFrame.append
Добавьте строки other в конец этого фрейма, возвращая новый объект. Столбцы, не входящие в этот фрейм, добавляются как новые столбцы.
(курсив мой).
Попробуйте
df_res = df_res.append(res)
Кстати, обратите внимание, что pandas не настолько эффективен для создания фрейма данных путем последовательных конкатенаций. Вместо этого вы можете попробовать это:
all_res = []
for df in df_all:
for i in substr:
res = df[df['url'].str.contains(i)]
all_res.append(res)
df_res = pd.concat(all_res)
Сначала создается список всех частей, затем создается фрейм данных из всех из них один раз в конце.
Комментарии:
1. спасибо за объяснение. Иногда
df_res.append(res)
работает, но иногдаdf_res = df_res.append(res)
работает только. Но я не знаю, почему это происходит2. @PetrPetrov Вы работаете в интерактивной среде?
3. 1 за указание на неэффективность использования этого для объединения нескольких фреймов данных в цикле. Я продолжаю находить это в коде, и это сводит меня с ума.
4. append устарел с версии 1.5 pandas.pydata.org/docs/reference/api /…
Ответ №2:
Если мы хотим добавить на основе индекса:
df_res = pd.DataFrame(data = None, columns= df.columns)
all_res = []
d1 = df.ix[index-10:index-1,] #it will take 10 rows before i-th index
all_res.append(d1)
df_res = pd.concat(all_res)