Как заполнить столбец «1000» * dfA (* dfA) значениями из другого dfB, в зависимости от значений столбца / строки из dfB? - PullRequest
2 голосов
/ 27 февраля 2020

У меня есть df (dfA) с ожидаемой продолжительностью жизни при рождении и ВВП в год из 6 стран. со следующей структурой :

country  year  expectancy  gdp  difference
chile    2000    60       1bn     NA
chile    2001    63       1.5bn  0.5bn
chile    2002    65       2.5bn  0.5bn
chile    2003    68       3.5bn  1.0bn
  .
  .
  .
chile    2015    80      10bn     10bn

Каждая строка представляет данные (ВВП, ожидаемая продолжительность и т. д. c) для страны за год, начиная с 2000 по 2015 год и с 6 стран.

Я создал новый фрейм данных для хранения важных общих переменных для каждой страны, таких как дельта ВВП (ВВП в 2015 году минус ВВП в 2000 году) для страны. Новый df (dfB) выглядит так: this :

country   startEndDelta (dummydata)
Chile        x
China        y
Germany      z
Mexico       a
USA          b
Zimbabwe     c

Что я хочу сделать, так это добавить новый столбец в мой файл newdf, который показывает, какой год имел наибольшее увеличение ВВП для каждого страна.

Я уже смог вычислить год, но сначала мне нужно было создать еще один кадр данных с записями только из одной страны. Здесь я делаю это так, как я говорил ранее.

То, как я sh сделал бы это, было бы примерно так:

dfB['biggestDeltaYear'] = ?year with the biggest increase in GDP?

Где этот сингл строка кода заполняет каждую строку в dfB для моего нового столбца "gestDeltaYear ".

Какие у меня варианты?

Большое спасибо

Ответы [ 3 ]

3 голосов
/ 27 февраля 2020

Может быть, вы можете попробовать использовать метод groupby () из pandas .DataFrame

dfA.groupby('country').apply(lambda x:x['year'].iloc[x['difference'].argmax()])
1 голос
/ 27 февраля 2020

Вы должны быть в состоянии достигнуть этого, используя groupby и применять лямбда-операции в Pandas. Ниже приведен пример, который я нарисовал:

Рассмотрим следующие данные:

Country,Year,GDP
Chile,2011,1.5
Chile,2012,1
Chile,2013,2
Chile,2014,2.3
Chile,2015,3.2
Nigeria,2011,0.6
Nigeria,2012,0.9
Nigeria,2013,2.1
Nigeria,2014,2.2
Nigeria,2015,2.6
Australia,2011,10.4
Australia,2012,14.4
Australia,2013,12.3
Australia,2014,13.3
Australia,2015,15

Сначала мы применим операцию различий по стране:

df['diff'] = df.groupby("Country")["GDP"].transform(pd.DataFrame.diff)

    Country     Year    GDP     diff
0   Chile       2011    1.5     NaN
1   Chile       2012    1.0     -0.5
2   Chile       2013    2.0     1.0
3   Chile       2014    2.3     0.3
4   Chile       2015    3.2     0.9
5   Nigeria     2011    0.6     NaN
6   Nigeria     2012    0.9     0.3
7   Nigeria     2013    2.1     1.2
8   Nigeria     2014    2.2     0.1
9   Nigeria     2015    2.6     0.4
10  Australia   2011    10.4    NaN
11  Australia   2012    14.4    4.0
12  Australia   2013    12.3    -2.1
13  Australia   2014    13.3    1.0
14  Australia   2015    15.0    1.7

Затем мы можем сгенерировать логический столбец на основе наибольшего значения:

df['biggestDeltaYear'] = df.groupby("Country")['diff'].apply(lambda x:x==x.max())
    Country     Year    GDP     diff    biggestDeltaYear
0   Chile       2011    1.5     NaN     False
1   Chile       2012    1.0     -0.5    False
2   Chile       2013    2.0     1.0     True
3   Chile       2014    2.3     0.3     False
4   Chile       2015    3.2     0.9     False
5   Nigeria     2011    0.6     NaN     False
6   Nigeria     2012    0.9     0.3     False
7   Nigeria     2013    2.1     1.2     True
8   Nigeria     2014    2.2     0.1     False
9   Nigeria     2015    2.6     0.4     False
10  Australia   2011    10.4    NaN     False
11  Australia   2012    14.4    4.0     True
12  Australia   2013    12.3    -2.1    False
13  Australia   2014    13.3    1.0     False
14  Australia   2015    15.0    1.7     False

Фактические значения года также можно получить вместо логического значения, используя:

df['Year'][df.groupby("Country")['diff'].apply(lambda x:x==x.max())]

или

df.iloc[df.groupby("Country")['diff'].apply(lambda x:x.idxmax())]['Year']

НТН.

1 голос
/ 27 февраля 2020

Вот еще один вариант:

dfA['biggestDeltaYear'] = (dfA.iloc[dfA.groupby('country')['difference']
                           .apply(lambda x: x.argmax())]['year'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...