Преобразование с суммой значений одного и того же столбца - PullRequest
1 голос
/ 28 мая 2020

У меня есть следующий фрейм данных: -

traffic_type    date        unique_visitors         region   total_views
desktop         01/04/2018  72                      aug      50
mobileweb       01/04/2018  1                       aug      60
total           01/04/2018  sum(mobileweb+desktop)  aug      100
desktop         01/04/2018  75848907.6              world    20
mobileweb       01/04/2018  105737747.4             world    30
total           01/04/2018  sum(mobileweb+desktop)  world    40

Это может быть дубликат, поэтому любая ссылка на похожие вопросы также поможет, и я могу построить сценарий на аналогичных строках. Как видите, данные, которые мне нужно заполнить в столбце unique_visitors, представляют собой сумму настольных и мобильных устройств, если они находятся в одном регионе и в одну дату. Dataframe, который мне нужен

traffic_type    date        unique_visitors region  total_views
desktop         01/04/2018  72              aug     50
mobileweb       01/04/2018  1               aug     60
total           01/04/2018  73              aug     100
desktop         01/04/2018  75848907.6      world   20
mobileweb       01/04/2018  105737747.4     world   30
total           01/04/2018  181,586,655     world   40

Снова прошу прощения, если это дублируется, я ищу справочные ссылки, если не точное решение.

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Это должно сработать. Создайте новый df, исключающий текстовую строку. Затем измените формат на числовой c с областями pd.to_numeric и .groupby, чтобы получить .sum(). Создайте новый столбец «traffic c type» в этом фрейме данных и установите значение «total», так что теперь вы готовы к pd.merge суммированным значениям в нескольких столбцах обратно в фрейм данных. Затем используйте np.where logi c, чтобы обновить значения, и удалите ненужный вспомогательный столбец для окончательного результата.

import pandas as pd, numpy as np
df1 = df.copy().loc[df['unique_visitors'] != '']
df1['unique_visitors'] = pd.to_numeric(df1['unique_visitors'])
df1 = df1.groupby('region')['unique_visitors'].sum().reset_index()
df1['traffic_type'] = 'total'
df2=pd.merge(df, df1, how='left', on=['traffic_type', 'region'], suffixes=('', '_y'))
df2['unique_visitors'] = np.where((df2['traffic_type'] == 'total'),
                                 df2['unique_visitors_y'],
                                 df2['unique_visitors'])
df2 = df2.drop('unique_visitors_y', axis=1)
df2
1 голос
/ 28 мая 2020

Вы можете использовать go строка за строкой и проверять и суммировать, как показано ниже


import pandas as pd

df = pd.DataFrame([["desktop","01/04/2018",72,"aug",50],
                ["mobileweb","01/04/2018",1,"aug",60],
                ["total","01/04/2018","","aug",100],
                ["desktop","01/04/2018",75848907.6 ,"world",20],
                ["mobileweb","01/04/2018",105737747.4,"world",30],
                ["total","01/04/2018","","world",40]],
                columns=["traffic_type","date","unique_visitors","region","total_views"])

for index, row in df.iterrows():
    if row["unique_visitors"] == "":
        df.at[index,"unique_visitors"] = df.loc[(df['date'] == row["date"]) & (df["region"] == row["region"]) & (df["unique_visitors"] != ""), 'unique_visitors'].sum()

print(df)

Вывод

 traffic_type        date unique_visitors region  total_views
0      desktop  01/04/2018              72    aug           50
1    mobileweb  01/04/2018               1    aug           60
2        total  01/04/2018              73    aug          100
3      desktop  01/04/2018     7.58489e+07  world           20
4    mobileweb  01/04/2018     1.05738e+08  world           30
5        total  01/04/2018     1.81587e+08  world           40

для окончательного ответа, вы должны go строка за строкой и добавьте эти строки в исходный набор данных.

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