#python #dataframe #multi-index
#python #фрейм данных #многоиндексный
Вопрос:
Мне нужно создать многоиндексный фрейм данных, содержащий данные, содержащиеся в двух разных фреймах данных. Для каждого индекса второго фрейма данных (дата), для каждой строки первого фрейма данных, если значение в столбце Дата первого фрейма данных равно индексу второго фрейма данных, затем создайте мне многоиндексный фрейм данных с каждой датой, количеством опубликованных твитов в каждом фрейме данных.день и особенности каждой строки.
Это первый фрейм данных с данными из Twitter:
Date Full text Retweets Likes
333 2018-04-13 RT @Tesla... 2838 0
332 2018-04-13 @timkhiggins... 7722 40733
331 2018-04-13 @TheEconomist.. 1911 18634
Это второй фрейм данных с данными с фондового рынка Tesla:
Open High Low Close Volume Gap
Date
2018-04-13 283.000000 296.859985 279.519989 294.089996 8569400 11.089996
2018-04-14 303.320000 304.940002 291.619995 291.970001 7286800 -11.349999
2018-04-25 287.760010 288.000000 273.420013 275.010010 8945800 -12.750000
Это то, что я пытался сделать:
for i in TeslaData.index:
for row in sortedTweetsData.iterrows():
if row[1]==i:
NumTweetsByDay =1
for num in NumTweetsByDay:
idx=pd.MultiIndex.from_product([[i],[NumTweetsBy]])
colum=col
df= pd.DataFrame(row,idx,column)
Результат, который я ищу, следующий:
Date Number of Tweets Full text Retweets Likes
2018-04-13 1 RT @Tesla... 2838 0
2 @timkhiggins... 7722 40733
3 @TheEconomist.. 1911 18634
Ответ №1:
Если я правильно понимаю, вы хотите отфильтровать данные Twitter по дате, если в наборе данных есть запись за ту же дату.
Вы можете сделать это с помощью isin():
# convert datatypes first:
sortedTweetsData['Date'] = pd.to_datetime(sortedTweetsData['Date'])
TeslaData.index = pd.to_datetime(TeslaData.index)
# do filtering
df = sortedTweetsData[sortedTweetsData['Date'].isin(TeslaData.index.values)]
далее вы можете определить, сколько твитов имеет каждая группа:
groupsizes = df.groupby(by='Date').size()
и используйте это для создания списка кортежей, чтобы определить ваш многоиндекс (вероятно, есть более элегантный способ сделать это):
tups = [(ix, gs 1) for ix in groupsizes.index.values for gs in range(groupsizes[ix])]
наконец:
df.index = pd.MultiIndex.from_tuples(tups, names=['Date', 'Number of Tweets'])
Комментарии:
1. Python выдает мне ошибку «недопустимого синтаксиса» в этой части кода: tups = [(ix, gs 1) для ix groupsizes.index.values для gs в диапазоне (groupsize[ix])]. В частности, в «groupsizes».
2. Последний вопрос! На данный момент я чувствую себя немного глупо. как, черт возьми, я могу получить реальные данные в фрейме?
3. Я не понимаю. Вы хотите, чтобы данные из df были сгенерированы в ответе?
4. То, что я получил из кодов, является пустым фреймом данных. Как мне получить данные?
5. хорошо, я думаю, это звучит как конфликт типов данных. (даты в фрейме данных Twitter имеют другой тип данных, чем даты в фрейме данных stocks, поэтому isin() везде вычисляется как False, оставляя пустой фрейм данных). смотрите правки.