Как я могу создать многоиндексный фрейм данных со следующими наборами данных?

#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, оставляя пустой фрейм данных). смотрите правки.