Группировка панд по функции применения в другом столбце, всегда извлекаемом из одной строки - PullRequest
0 голосов
/ 10 июля 2019

спасибо, что позволили мне задать свой вопрос здесь.Я новичок в пандах и пытаюсь работать со странными данными

Я привел воспроизводимый пример ниже [и я застрял на нем довольно долго], так что если кто-то из вас может помочь мнес этим это очень ценится

import pandas as pd


import numpy as np

np.random.seed(123)
#Define a dataframe. Example of products sold per state
df = pd.DataFrame({'state': ['CA', 'WA', 'CO', 'AZ'] * 3,
                   'sales': [np.random.randint(100000, 999999)
                             for _ in range(12)],
'another_column': [x for x in range(12)]})
#Define a "product mix"
df["sales_prod_1"] = df["sales"]*0.5
df["sales_prod_2"] = np.random.uniform(low = 0,high = 0.4) * df["sales"]
df["sales_prod_3"] = (df["sales"]-df["sales_prod_1"] - df["sales_prod_2"])

#This is the tricky part! My data contains a row in which the "total" per state is contained
df = df.append(df.groupby("state", as_index = True).apply(lambda x: x.iloc[:,1:].sum()).reset_index())

#Add a new column that tells us which rows are the "total" rows (my data does contain this)
type_column = ["sales_office"]*12
type_column.extend(["total"]*4)
df["type"] = type_column

#What I want is the product share per sales_prod, but in the entire state
def shares(row):
    res = pd.DataFrame()
    res["prod1"] = row["sales_prod_1"]/row["sales"].sum()
    res["prod2"] = row["sales_prod_2"]/row["sales"].sum()
    res["prod3"] = row["sales_prod_3"]/row["sales"].sum()
    return(res)

df.groupby("state").apply(lambda row: shares(row))

#

Теперь я согласен, в приведенном примере я мог просто умножить на 2 и получить правильный результат.Однако, к сожалению, мои данные сформированы не так хорошо, как в примере, и 2 не является правильным ответом (например, некоторые штаты разделены на районы, некоторые - на субрайоны и снова объединены в районы и т. Д., Что означает, что целое число не является правильным).

#Replacing res["prod1"] for example with:
res["prod1"] = res["prod1"] = row["sales_prod_1"]/row.loc[row["type"] == "total","sales"]
#Gives me lots of Nans - I dont know what causes them but I think this should work
#Adding:
res["another_col"] = row["another_column"] 

работает в предоставленном примере.Однако, по моим данным, это не работает.Выдает ошибку «невозможно назначить несколько индексов», однако все столбцы уникальны, поэтому я предполагаю, что это ошибка строк. Как мне выяснить причину этого?

Я бы хотел, чтобы выходные данные былипродукт делится на продукт с точки зрения итогов по штату - что я действительно могу получить.Я не понимаю, почему появляются значения Nan, и я также не понимаю, почему мои фактические данные выдают ошибку «невозможно назначить несколько индексов».

Большое спасибо, ребята!

...