Панды Датафреймы - PullRequest
       7

Панды Датафреймы

0 голосов
/ 13 июня 2018

Я все еще новичок в python и мне нужна помощь в настройке фрейма данных.У меня есть набор данных с 5 конкурентами, 3 возможных настроения и число, называемое Скорректированное количество.Вот пример файла данных: https://www.sendspace.com/file/0xfh5s

Мне нужно создать фрейм данных, у которого есть конкуренты по настроению и сумме скорректированного количества.

Это должно выглядеть так:

            Positive    Balanced    Negative    Grand Total
A           335         208         33          576
B           346         170         97          613
C           573         90          454         1117
D           1955        1456        1762        5173
E           253         0           189         442
Grand Total 3462        1924        2535        7921

Но вместо этого вот что я сейчас получаю:

            Positive    Balanced    Negative    Total
A           0           0           0           0
B           0           0           0           0
C           0           0           0           0
D           0           0           0           0
E           0           0           0           0

Вот мой текущий код:

PATH_DATA = '...filename.xlsx'

df1 = pd.read_excel(PATH_DATA, 'A')
df2 = pd.read_excel(PATH_DATA, 'B')
df3 = pd.read_excel(PATH_DATA, 'C')
df4 = pd.read_excel(PATH_DATA, 'D')
df5 = pd.read_excel(PATH_DATA, 'E')
df_ALL = pd.concat([df1, df2, df3, df4, df5]) 

SENTIMENT_DIMENTION = 'Sentiment simplified'
SENTIMENT_ORDER = ['Positive', 'Balanced', 'Negative']
COMPETITOR_DIMENTION = 'Competitor Name'
COMPETITOR_ORDER = ['A', 'B', 'C', 'D', 'E']
AC_DIMENTION = 'Adjusted Count'

class Report:
    def ACbysentiment(self, vdimention, hdimention, indexlist):
        data = self.data
        data = data.groupby([vdimention, hdimention]).size().unstack(1)
        #data = data.groupby('Adjusted Count')[sumdimention].agg('sum')
        data = data.reindex(columns=indexlist)
        data['Total'] = data.sum(axis=1)
        data.fillna(0, inplace = True)
        data = data.sort_values('Total', ascending=True)
        return data

df_ALL = df_ALL.replace(np.nan, NAN_VAL, regex=True)
S1 = Report(df_ALL)

S1_Competitor_Sentiment_AC = S1.ACbysentiment(COMPETITOR_DIMENTION, AC_DIMENTION, SENTIMENT_ORDER)
S1_Competitor_Sentiment_AC = pd.DataFrame(S1_Competitor_Sentiment_AC, index = COMPETITOR_ORDER)

Буду признателен за любую помощь, которую вы можете оказать!

Спасибо

Вот пример того, как может выглядеть df_ALL:

Competitor  Sentiment simplified    Adjusted Count
A           Positive                50
A           Balanced                40
A           Negative                30
A           Positive                10
B           Balanced                50
B           Negative                40
B           Positive                30
B           Balanced                10
B           Negative                50
B           Positive                40
C           Balanced                30
C           Negative                10
C           Positive                50
C           Balanced                40
C           Negative                30
D           Positive                10
D           Balanced                50
D           Negative                40
E           Positive                30
E           Balanced                10
E           Negative                50
E           Positive                40
E           Balanced                30
E           Negative                10
E           Positive                50

1 Ответ

0 голосов
/ 13 июня 2018

GroupBy ваш друг здесь.Я не нашел никаких ссылок на файл Excel.Я предполагаю, что у вас есть лист для конкурента с информацией о настроениях (я думаю, 1 и 0).Первое, что вам нужно сделать, это добавить имя участника.Вы можете сделать это двумя способами, либо добавить его в сам лист Excel, либо после прочтения листа Excel следующим образом:

df1 = pd.read_excel(PATH_DATA, 'A')
df1['competitor'] = 'A'

Это добавит столбец с именем Competitor со значением 'A'.В вашем случае значение конкурента имеет важное значение, потому что вы будете агрегировать по этой стоимости.После того, как вы сделали это только для всех фреймов данных, вы должны объединить их:

df_ALL = pd.concat([df1, df2, df3, df4, df5])

После этого вы можете применить групповую обработку к фрейму данных:

df_grouped = df_All.groupby(by='competitor',as_index = False).sum()

EDIT : решение на основе классов

class Report:
    def __init__(self,dataframe):
        self.data = dataframe
    def ACbysentiment(self, vdimention, hdimention):
        data = self.data
        data = data.groupby(by=[vdimention, hdimention],as_index=False).sum()
        data = data.pivot(index='Competitor',columns = 'Sentiment simplified',values='Adjusted Count')
        data['Total'] = data.sum(axis=1) 
        #data.fillna(0, inplace = True) not required as we are aggregating
        data = data.sort_values('Total', ascending=True)
        return data

Примечание : метод init требуется для передачи кадра данных в класс.Ваш текущий код вызывает исключение.

Также обратите внимание, что я использовал groupby с as_index = False.Это позволяет групповой стиль SQL, который вы ищете.Таким образом, вы можете заменить:

data = data.groupby([vdimention, hdimention]).size().unstack(1)

на

data = data.groupby(by=[vdimention, hdimention],as_index=False).sum() 

Наконец, если я правильно понимаю, вы хотите (в терминах Excel) повернуть данные так, чтобы мы использовали df.Pivot () метод:

data = data.pivot(index='Competitor',columns = 'Sentiment simplified',values='Adjusted Count')

Я также думаю, что вам не нужны различные «измерения», которые вы определили (если только они не используются в другом месте вашего кода).Вам просто нужно два:

COMPETITOR_DIMENTION = 'Competitor' # just the name of the column,case sensitive
AC_DIMENTION = 'Sentiment simplified'

, а затем:

S1_Competitor_Sentiment_AC = S1.ACbysentiment(COMPETITOR_DIMENTION, AC_DIMENTION)

Это вернет кадр данных pandas с желаемым выходом.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...