【问题标题】:Python Pandas: Merge doesnt handle NaN correctlyPython Pandas:合并不能正确处理 NaN
【发布时间】: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


【解决方案1】:

@jezreal 感谢您提供解决方案!

将我的 pandas 版本升级到 1.1.2 解决了这个问题。

【讨论】:

    猜你喜欢
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 2016-06-06
    相关资源
    最近更新 更多