Панды делятся на несколько записей столбца

Впервые в Pandas. Хотите знать, как разделить фрейм данных, сгруппированный по нескольким столбцам? Я хочу получить пропорцию var3 (по некоторому условию) 'var1' и 'var2'. Можно представить себе эту проблему как определение процента времени, проведенного на работе в обычные рабочие часы, по дню и роду занятий. Var 3 - это время, проведенное на работе (обусловленное нормальным рабочим временем для df2), сгруппированное по дню и роду занятий.

df = pd.DataFrame(data) ###all data, here all time 
df2 = df[(df['hours'] > x)] ### subset, here all time during normal business hours

df = df.groupby(["var1", "var2"]).var3.sum()
df2 = df2.groupby(["var1", "var2"]).var3.sum()
normal_bus_hours_percent = (df2.div(df, level=['var1', 'var2']) * 100)
This fails TypeError: Join on level between two MultiIndex objects is ambiguous

Даже если бы вы могли мне помочь, просто объедините эти фреймы данных. Я получаю эту ошибку: AttributeError: объект 'Series' не имеет атрибута 'columns'

Если я попытаюсь объединить, я получаю эту ошибку: TypeError: первый аргумент должен быть списком объектов pandas, вы передали объект типа "Series"

Я пришел из R, поэтому привык к простому cbind или merge.


person Joanne Rodrigues    schedule 19.08.2014    source источник
comment
какую версию панд вы используете?   -  person Andy Hayden    schedule 20.08.2014


Ответы (2)


Pandas по умолчанию выравнивается по индексу, это не работает?

 normal_bus_hours_percent = (df2.div(df) * 100)
person chrisb    schedule 19.08.2014

Не уверен, как вы это делаете groupby. Как это выглядит?

df1 = pandas.DataFrame([
    ['Atlanta', 'A', 1],
    ['Atlanta', 'A', 2],
    ['Atlanta', 'B', 3],
    ['Atlanta', 'B', 13],
    ['Boston', 'A', 4],
    ['Boston', 'A', 14],
    ['Boston', 'B', 5],
    ['Boston', 'B', 16],
    ['Portland', 'A', 7],
    ['Portland', 'A', 1],
    ['Portland', 'B', 9],
    ['Portland', 'B', 9],
    ['Seattle', 'B', 8],
    ['Seattle', 'B', 7],
    ['Seattle', 'C', 2],
    ['Seattle', 'C', 8],
], columns=['vars1', 'vars2', 'hours'])

df2 = df1[df1['hours'] > 6]

df1g = df1.groupby(by=['vars1', 'vars2']).sum()
df2g = df2.groupby(by=['vars1', 'vars2']).sum()

df2g.div(df1g).fillna(0)

Который дает:

                   hours
vars1    vars2          
Atlanta  A      0.000000
         B      0.812500
Boston   A      0.777778
         B      0.761905
Portland A      0.875000
         B      1.000000
Seattle  B      1.000000
         C      0.800000
person Paul H    schedule 20.08.2014