如何根据来自dfB的列/行值,用来自另一个数据框(dfB)的值填充熊猫数据框(dfA)列“ A”?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何根据来自dfB的列/行值,用来自另一个数据框(dfB)的值填充熊猫数据框(dfA)列“ A”?相关的知识,希望对你有一定的参考价值。

我有一个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

[每一行代表一个国家/地区的每年数据(gdp,期望值等),范围是2000年至2015年,并包含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?

在我的新列'biggestDeltaYear'的dfB中,每一行代码都填充了dfB中的每一行。

我有什么选择?

非常感谢

答案

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

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并在熊猫中应用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。

以上是关于如何根据来自dfB的列/行值,用来自另一个数据框(dfB)的值填充熊猫数据框(dfA)列“ A”?的主要内容,如果未能解决你的问题,请参考以下文章

将行值转换为列,其值来自 spark scala 中的另一列 [重复]

根据匹配的列标签将行值添加到数据框

根据来自不同数据帧的行名将列从另一个数据帧复制到

来自不同数据框的列的数学运算

如何检查来自不同数据框的列值?

如何根据条件行值对 pandas 数据框进行取消堆叠或取消透视?