#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. отлично, большое спасибо!