如何根据 dfB 中的列/行值,使用另一个数据帧 (dfB) 中的值填充 pandas 数据帧 (dfA) 列"A"?



我有一个df(dfA(,其中包括6个国家的出生预期寿命和每年gdp。具有以下结构:

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

每一行代表一个国家每年的数据(gdp、预期等(,从2000年到2015年,共有6个国家。

我创建了一个新的数据框架来存储每个国家的重要总体变量,例如每个国家的GDP德尔塔(2015年的GDP减去2000年的GDP(。新的df(dfB(看起来像这样:

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

我想做的是在我的newdf中添加一个新的专栏,显示每个国家哪一年的GDP增长最大。

我已经能够计算年份了,但我首先必须用来自一个国家的记录创建另一个数据帧。在这里,我按照以前的方式做。

我希望这样做的方式类似于:

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

其中,这一行代码填充了我的新列"biggestDeltaYear"的dfB中的每一行。

我有什么选择?

非常感谢

也许您可以尝试使用panda的groupby((方法。DataFrame

dfA.groupby('country').apply(lambda x:x['year'].iloc[x['difference'].argmax()])

这里有另一个选项:

dfA['biggestDeltaYear'] = (dfA.iloc[dfA.groupby('country')['difference']
.apply(lambda x: x.argmax())]['year'])

您应该能够使用groupby实现这一点,并在Pandas中应用lambda运算。下面是我画的一个例子:

考虑以下数据:

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']

HTH。

最新更新