【发布时间】:2020-09-18 07:49:09
【问题描述】:
我正在处理一个大型数据集。下面的例子和我自己的数据类似:
例子:
- 我们计算每个区域每年生长的树木数量(“t-count”)。
- 每年都会种植新树,我们知道这些树最终会在哪一年生长(“year_of_growth”)。
- 目标是创建一个新列(“seed_result”),其中包含当年种子产生的树木数量。
- 如果“year_of_growth”未知(= NaN),则无法计算“seed_result”
import pandas as pd
import numpy as np
ids = [1,1,1,1,1,2,2,2,2,2,3,3,3,3,3]
year = [2000,2001,2002,2003,2004,1990,1991,1992,1993,1994,2000,2001,2002,2003,2004]
y1 = [2002,2002,2004,2004,np.NaN,1991,1992,1993,np.NaN,np.NaN,2002,2002,2003,2004,np.NaN]
count = [10,14,20,11,8,
20,22,20,25,18,
30,19,15,10,26]
dictt1 ={"area_id":ids,"year":year,"t-count": count,"year_of_growth":y1}
dft1 = pd.DataFrame(dictt1)
print(dft1)
area_id year t-count year_of_growth
0 1 2000 10 2002.0
1 1 2001 14 2002.0
2 1 2002 20 2004.0
3 1 2003 11 2004.0
4 1 2004 8 NaN
5 2 1990 20 1991.0
6 2 1991 22 1992.0
7 2 1992 20 1993.0
8 2 1993 25 NaN
9 2 1994 18 NaN
10 3 2000 30 2002.0
11 3 2001 19 2002.0
12 3 2002 15 2003.0
13 3 2003 10 2004.0
14 3 2004 26 NaN
结果应该是这样的:
area_id year t-count year_of_growth seed_result
0 1 2000 10 2002.0 20.0
1 1 2001 14 2002.0 20.0
2 1 2002 20 2004.0 8.0
3 1 2003 11 2004.0 8.0
4 1 2004 8 NaN NaN
5 2 1990 20 1991.0 22.0
6 2 1991 22 1992.0 20.0
7 2 1992 20 1993.0 25.0
8 2 1993 25 NaN NaN
9 2 1994 18 NaN NaN
10 3 2000 30 2002.0 15.0
11 3 2001 19 2002.0 15.0
12 3 2002 15 2003.0 10.0
13 3 2003 10 2004.0 26.0
14 3 2004 26 NaN NaN
我自己解决这个问题的方法是使用“合并功能”。这似乎适用于前几个数据点,但随后在“year_of_growth”列中的第一个“NaN”值处失败。出现以下问题:
- 即使“year_of_growth”列中有“NaN”值,结果也会显示“seed_result”值
- 在“year_of_growth”列中的第一个“NaN”值之后,所有后续的“seed_result”值都是错误的
- 我尝试简单地使用“.fillna()”将 NaN 值更改为“-999”,但这并没有改变结果
我自己的做法是这样的:
dft1["seed_result"] = dft1.merge(dft1, left_on=["area_id","year"],
right_on=["area_id","year_of_growth"],
how="right")["t-count_x"]
print(dft1)
area_id year t-count year_of_growth seed_result
0 1 2000 10 2002.0 20.0
1 1 2001 14 2002.0 20.0
2 1 2002 20 2004.0 8.0
3 1 2003 11 2004.0 8.0
4 1 2004 8 NaN 22.0
5 2 1990 20 1991.0 20.0
6 2 1991 22 1992.0 25.0
7 2 1992 20 1993.0 15.0
8 2 1993 25 NaN 15.0
9 2 1994 18 NaN 10.0
10 3 2000 30 2002.0 26.0
11 3 2001 19 2002.0 NaN
12 3 2002 15 2003.0 NaN
13 3 2003 10 2004.0 NaN
14 3 2004 26 NaN NaN
我将非常感谢任何导致正确结果的建议!请记住,真实的数据集比这个大得多。
【问题讨论】:
-
你的熊猫版本是什么?在
1.1.1中测试并正确解决您的解决方案。
标签: python pandas dataframe merge