如何使用另一个数据帧(dfB)中的值填充数据帧(dfA)列“a”,具体取决于dfB中的列/行值?

2024-05-15 21:12:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个df(dfA),有6个国家的出生时预期寿命和每年gdp。与以下structure一起:

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

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

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

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

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

我已经能够计算这一年了,但我首先必须用一个国家的记录创建另一个数据框Here I do it the way I metioned before.

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

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

其中,这一行代码填充dfB中新列“biggestDeltaYear”的每一行

我有什么选择

非常感谢


Tags: the数据df国家structureyearcountrydfa
3条回答

您应该能够使用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']

还有一个选择:

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

也许您可以尝试使用pandas.DataFrame的groupby()方法

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

相关问题 更多 >