Фрейм данных Pandas: Вычисление коэффициентов внутри группы

#python #pandas #dataframe

#питон #панды #фрейм данных

Вопрос:

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

 df = pd.DataFrame(  {  "Farm ID": ["1", "2", "2", "3", "3"],  "Crop": ["Type A", "Type A", "Type B", "Type B", "Type B"],  "Plot ID": ["A", "A", "B", "A", "B"],  "Plot area": ["8", "4", "2", "3"],  "More values": ["101", "215", "13", "0.6"],  "More text": ["foo", "bar", "foobar", "barfoo"],  } )  

Для каждого участка я теперь хочу знать соотношение площади участка к общей площади фермы, если на участках есть разные культуры. Затем я также хочу объединить участки с одним и тем же урожаем. Таким образом, результат должен выглядеть следующим образом:

 Plot ID Plot area area share More values More text Farm ID Crop  1 Type A A 8 1 101 foo 2 Type A A 4 0.66 215 bar  Type B B 2 0.33 13 foobar 3 Type B AB 35 1 0.642 barfoonothing  

Я знаю, что я могу использовать dfNew = df.groupby(["Farm ID", "Crop"]).sum() , чтобы получить правильную структуру и FarmArea = df.groupby(level=0).sum() получить площадь фермы, но я не могу понять, как это сделать area share . Есть какие-нибудь предложения?

Комментарии:

1. Отсутствующие данные в области уловки и дополнительный текст значения

Ответ №1:

Вы можете использовать transform :

 df = pd.DataFrame(  {  "Farm ID": ["1", "2", "2", "3"],  "Crop": ["Type A", "Type A", "Type B", "Type B"],  "Plot ID": ["A", "A", "B", "A"],  "Plot area": [8, 4, 2, 3],  "More values": ["101", "215", "13", "0.6"],  "More text": ["foo", "bar", "foobar", "barfoo"],  } ) dfNew = df.groupby(["Farm ID", "Crop"]).sum()  dfNew["Area share"]=dfNew["Plot area"] / dfNew.groupby(["Farm ID"])["Plot area"].transform("sum")  dfNew  

выход:

 Plot area Area share Farm ID Crop  1 Type A 8 1.000000 2 Type A 4 0.666667  Type B 2 0.333333 3 Type B 3 1.000000  

Пожалуйста, обратите внимание, что я загрузил область графика как числовую, если это не так, вам может потребоваться преобразовать ее перед использованием преобразования.

Комментарии:

1. отлично, большое спасибо!