Как перебрать строки указанного столбца DataFrame c Pandas, учитывая условие из другого столбца? - PullRequest
0 голосов
/ 11 февраля 2020

Итак, что я в основном хочу сделать, это следующее, основанное на кадре данных со столбцами «дата» и «полярность», с семью различными значениями в «дата» (дни) и значениями в «полярность» между -1 и 1:

For each of the seven days:
i) count all values in the 'polarity' column that are positive
ii) count all values in the 'polarity' column that are negative
iii) count all values in the 'polarity' column for a given day (neg, neutral, pos)

Редактировать: выходные данные должны быть целыми числами для каждого из i) -iii) для каждого дня, сохраненного в списке

Edit2: я пытался реализовать его, используя следующую код (только для значений> 0):

pos_tweets = df_tweets.apply(lambda x: True if x['polarity'] > 0 and x['date'] == '2020-02-07' else False, axis=1)
num_Pos = len(pos_tweets[pos_tweets == True].index)

Это, однако, вернуло 0, что при проверке в Excel неверно.

Пожалуйста, оцените помощь!

Приветствия, IG

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Рассмотрим pivot_table с полями. Ниже показаны случайные, посеянные данные:

Данные

import numpy as np
import pandas as pd

np.random.seed(2112020)
random_df = pd.DataFrame({'date': np.random.choice(pd.date_range('2020-02-01', '2020-02-11'), 500),
                          'polarity': np.random.randint(-1, 2, 500)})

print(random_df.head(10))
#         date  polarity
# 0 2020-02-08        -1
# 1 2020-02-08         1
# 2 2020-02-06         0
# 3 2020-02-10        -1
# 4 2020-02-04        -1
# 5 2020-02-02         1
# 6 2020-02-05        -1
# 7 2020-02-04         0
# 8 2020-02-10         1
# 9 2020-02-09         0

Агрегация

pvt_df = (random_df.assign(day_date = lambda x: x['date'].dt.normalize(),
                           polarity_indicator = lambda x: np.select([x['polarity'] > 0, x['polarity'] < 0, x['polarity'] == 0],
                                                                    ['positive', 'negative', 'neutral']))
                   .pivot_table(index = 'day_date',
                                columns = 'polarity_indicator',
                                values = 'polarity',
                                aggfunc = 'count',
                                margins = True)
         )

print(pvt_df)

#  polarity_indicator   negative  neutral  positive  All
#  day_date
#  2020-02-01 00:00:00        17       14        16   47
#  2020-02-02 00:00:00        19       14        12   45
#  2020-02-03 00:00:00        11       16        12   39
#  2020-02-04 00:00:00        17       18        13   48
#  2020-02-05 00:00:00        11       15        22   48
#  2020-02-06 00:00:00        12       12        16   40
#  2020-02-07 00:00:00        16       15        21   52
#  2020-02-08 00:00:00        15       10        13   38
#  2020-02-09 00:00:00        17       15        19   51
#  2020-02-10 00:00:00        13       16        19   48
#  2020-02-11 00:00:00        13       12        19   44
#  All                       161      157       182  500
0 голосов
/ 11 февраля 2020

Если я правильно понимаю, вы хотите рассчитывать значения полярности для каждого дня. Может быть исправлено что-то вроде этого:

positive = df_tweets[df_tweets['polarity'] > 0].groupby('date').count().reset_index()
negative = df_tweets[df_tweets['polarity'] < 0].groupby('date').count().reset_index()
neutral = df_tweets[df_tweets['polarity'] == 0].groupby('date').count().reset_index() 

Вывод этого кода представляет собой три кадра данных с двумя столбцами: один с уникальными значениями даты и один с количеством полярностей, большим, меньшим или равным 0.

...