【问题标题】:Filtering and adding a NaN value row过滤和添加 NaN 值行
【发布时间】:2019-08-07 13:27:44
【问题描述】:

我有一个看起来像这样的数据框:

Country     Year    Value
USA         1991     22
USA         1992     3
USA         1993     10
China       1991     1
China       1993     15
Argentina   1991     6
Argentina   1992     4

我需要一个函数来查找每个国家/地区的缺失年份,并将带有 NaN 值的行添加到数据框中。

Country     Year    Value
USA         1991     22
USA         1992     3
USA         1993     10
China       1991     1
China       1992     NaN
China       1993     15
Argentina   1991     6
Argentina   1992     4
Argentina   1993     NaN

我还需要创建一个数据框,其值仅基于我拥有所有国家/地区的值的年份。

Country     Year    Value
USA         1991     22
China       1991     1
Argentina   1991     6

【问题讨论】:

    标签: pandas dataframe filter nan


    【解决方案1】:

    DataFrame.set_indexMultiIndex.from_product 一起用于DataFrame.reindex

    df = df.set_index(['Country','Year'])
    mux = pd.MultiIndex.from_product(df.index.levels, names=df.index.names)
    df = df.reindex(mux).reset_index()
    print (df)
         Country  Year  Value
    0  Argentina  1991    6.0
    1  Argentina  1992    4.0
    2  Argentina  1993    NaN
    3      China  1991    1.0
    4      China  1992    NaN
    5      China  1993   15.0
    6        USA  1991   22.0
    7        USA  1992    3.0
    8        USA  1993   10.0
    

    对于没有缺失值的组:

    vals = df1.loc[df1['Value'].isna(), 'Country'].unique()
    df2 = df1[~df1['Country'].isin(vals)]
    print (df2)
      Country  Year  Value
    6     USA  1991   22.0
    7     USA  1992    3.0
    8     USA  1993   10.0
    

    替代方法是使用DataFrame.unstackDataFrame.stack

    s = df.set_index(['Country','Year']).unstack()
    df1 = s.stack(dropna=False).reset_index()
    print (df1)
         Country  Year  Value
    0  Argentina  1991    6.0
    1  Argentina  1992    4.0
    2  Argentina  1993    NaN
    3      China  1991    1.0
    4      China  1992    NaN
    5      China  1993   15.0
    6        USA  1991   22.0
    7        USA  1992    3.0
    8        USA  1993   10.0
    

    对于每列的所有值,请使用DataFrame.dropna

    df2 = s.dropna(axis=1).stack().reset_index()
    print (df2)
         Country  Year  Value
    0  Argentina  1991    6.0
    1      China  1991    1.0
    2        USA  1991   22.0
    

    编辑:

    如果得到:

    ValueError: 无法处理非唯一的多索引!

    这意味着CountryYear 列的组合不是唯一的:

    print (df)
         Country  Year  Value
    0        USA  1991     22 <-duplicate USA, 1991
    1        USA  1991      3 <-duplicate USA, 1991
    2        USA  1993     10
    3      China  1991      1
    4      China  1993     15
    5  Argentina  1991      6
    6  Argentina  1992      4
    

    解决方案是将 set_index 更改为 groupby 并使用一些聚合函数,例如 meansum 以获得独特的组合:

    df = df.groupby(['Country','Year']).mean()
    mux = pd.MultiIndex.from_product(df.index.levels, names=df.index.names)
    df = df.reindex(mux).reset_index()
    print (df)
         Country  Year  Value
    0  Argentina  1991    6.0
    1  Argentina  1992    4.0
    2  Argentina  1993    NaN
    3      China  1991    1.0
    4      China  1992    NaN
    5      China  1993   15.0
    6        USA  1991   12.5
    7        USA  1992    NaN
    8        USA  1993   10.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-05
      • 2014-05-18
      • 2020-09-04
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 2017-09-17
      相关资源
      最近更新 更多