Максимальная разница значений в столбцах pandas кадра данных - PullRequest
0 голосов
/ 03 мая 2020

У меня есть датафрейм с 8 столбцами следующим образом:

  1. Индекс
  2. Название округов
  3. Население с переписи 2010 года
  4. Население с переписи 2011 года
  5. население с переписи 2012 года
  6. население с переписи 2013 года
  7. население с переписи 2014 года
  8. население с переписи 2015 года

Мне нужно найти округ, в котором произошло наибольшее абсолютное изменение численности населения за период 2010–2015 гг.?

Например, если население округа за 5-летний период составляет 100, 120, 80, 105, 100, 130, то его наибольшее изменение в периоде будет | 130-80 | = 50. Я могу придумать решение, использующее циклы и условные выражения, но, похоже, это не лучший способ решения проблемы. Как я могу написать простой код, используя функции pandas dataframe?

Ответы [ 2 ]

1 голос
/ 03 мая 2020
import pandas as pd

df = pd.DataFrame(
    {
        "country": ["India", "US", "China"],
        "2010": [200, 100, 300],
        "2012": [400, 200, 500],
        "2015": [800, 400, 700],
    }
)

df["abs_change"] = df.apply(
    lambda x: max(x[df.columns[-3:]]) - min(x[df.columns[-3:]]), axis=1
)

print(df.iloc[df[["abs_change"]].idxmax()])

Это может быть возможным решением вашей проблемы без использования циклов for. Хотя я не уверен на 100% о влиянии на производительность, это может быть лучше, чем использование для циклов.

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

Используйте методы min и max для фрейма данных при установке параметра axis на 1. Если вы установите столбец 'Name of the counties' в качестве индекса, это сделает его немного проще. Затем вы можете использовать idxmax, чтобы определить, в каком округе самый большой диапазон.

df = df.set_index('Name of the counties')
(df.max(axis=1) - df.min(axis=1)).idxmax())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...