Создайте новый фрейм данных с заданным условием цикла в другом фрейме данных - PullRequest
0 голосов
/ 22 ноября 2018

Это тот фрейм данных, который я хочу перебрать.Индекс установлен как для countries, так и для year.

                            ISO_code    gini    ECONOMIC FREEDOM    rank    quartile    1a_government_consumption
        countries   year                                                                                    
        Argentina   1980    ARG         40.8    4.25    80.0    4.0 6.911765
                    1995    ARG         48.9    6.95    37.0    2.0 8.058824
                    2000    ARG         51.1    7.34    37.0    2.0 6.877627
                    2001    ARG         53.3    6.84    56.0    2.0 6.752473
                    2002    ARG         53.8    6.28    79.0    3.0 6.905961
                    2003    ARG         50.7    6.16    86.0    3.0 7.264992
        Bolivia     1980    BOL         40.8    4.25    80.0    4.0 6.911765
                    1985    BOL         48.9    6.95    37.0    2.0 8.058824
                    1995    BOL         51.1    7.34    37.0    2.0 6.877627
                    2000    BOL         53.3    6.84    56.0    2.0 6.752473
                    2001    BOL         53.8    6.28    79.0    3.0 6.905961
                    2002    BOL         50.7    6.16    86.0    3.0 7.264992
        Chile       1985    CHI         40.8    4.25    80.0    4.0 6.911765
                    1990    CHI         48.9    6.95    37.0    2.0 8.058824
                    1995    CHI         51.1    7.34    37.0    2.0 6.877627
                    1999    CHI         53.3    6.84    56.0    2.0 6.752473
                    2002    CHI         53.8    6.28    79.0    3.0 6.905961
                    2003    CHI         50.7    6.16    86.0    3.0 7.264992

. Я хотел бы создать цикл for, который возвращает такой кадр данных:

countries    change gini    change ef                                                                 
Argentina    +              +
Bolivia      -              +
Chile        -              -
  1. countries - это просто столбцы с названиями стран из предыдущего кадра данных.

  2. change gini должна быть процентной разницей между последним значением столбца giniдля каждой страны и самой последней.Если процентное увеличение является положительным, то оно должно показать +;если он отрицательный, то он должен показать -.

  3. change ef, следуя той же логике, что и change gini в новом кадре данных, с той лишь разницей, что используемые значениядля расчета процентного изменения используйте столбец ECONOMIC FREEDOM в исходном кадре данных.

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Этого можно легко достичь с помощью функций группировки.
К сожалению, первые и последние значения трех стран в вашем наборе данных одинаковы, поэтому результат также в три раза больше двух одинаковых значений.
(Возможно, что-то не так с выборочными данными?)

Сначала сгруппируйте фрейм данных по странам и выберите только два интересующих столбца:

grpd = df.groupby('countries')['gini', 'ECONOMIC FREEDOM']

С этим Groupby-Object вы можете применять функции к подмножествам ваших данных, которые разделены функцией группировки, countries в вашем случае.
Например, чтобы получить последнее значение в каждой группе, просто запросите

grpd.last()

           gini  ECONOMIC FREEDOM
countries                        
Argentina  50.7              6.16
Bolivia    50.7              6.16
Chile      50.7              6.16

или, соответственно, для первой строки в каждой группе

grpd.first()

           gini  ECONOMIC FREEDOM
countries                        
Argentina  40.8              4.25
Bolivia    40.8              4.25
Chile      40.8              4.25

для расчета процента изменения последнего относительно первого, поэтому вы могли бы просто написать

(grpd.last() - grpd.first()) / grpd.first()

                gini  ECONOMIC FREEDOM
countries                             
Argentina  0.242647         0.449411
Bolivia    0.242647         0.449411
Chile      0.242647         0.449411

РЕДАКТИРОВАТЬ:
вывод также может быть отформатирован, например:

df_change = (grpd.last() - grpd.first()) / grpd.first()

df_change.applymap(lambda x: str.format('{:+.1f%}', x))

             gini ECONOMIC FREEDOM
countries                         
Argentina  +24.3%           +44.9%
Bolivia    +24.3%           +44.9%
Chile      +24.3%           +44.9%

EDIT2:
только для знаков:

df_change.applymap(lambda x: ['-', ' ', '+'][np.sign(x).astype(int)+1])

          gini ECONOMIC FREEDOM
countries                      
Argentina    +                +
Bolivia      +                +
Chile        +                +
0 голосов
/ 22 ноября 2018

Создание пустых списков и добавление нужных значений из столбцов countries, gini и ECONOMIC FREEDOM для каждой страны.

    countries = []
    gini = []
    efw = []
    for i in new_df.index.levels[0]:
        countries.append(i)
        country = new_df.loc[i]
        country = country.reset_index()
        x = country.iloc[0].tolist()
        y = country.iloc[-1].tolist()
        change_g = (((y[2] / x[2]) - 1) * 100)
        change_e = (((y[3] / x[3]) - 1) * 100)
        gini.append(change_g)
        efw.append(change_e)

Затем выполните цикл for.Для каждого номера вы добавляете + или -.

g = []
e = []
for n in gini:
    if n > 0:
        g.append("+")
    g.append("-")

for f in efw:
    if f > 0:
        e.append("+")
    e.append("-")

. Затем создаете кадр данных со списками countries, g и e.

tuples = list(zip(countries,g,e))
changes = pd.DataFrame(tuples, columns=['Country','Change in Gini', "Change in Economic Freedom"])
.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...