【问题标题】:Pandas not reindexing properly with NaN熊猫没有用 NaN 正确重新索引
【发布时间】:2020-06-15 03:02:22
【问题描述】:

在删除 NaN 值后,我无法重新索引 pandas 数据帧。

我正在尝试将 df 列中的字典提取到另一个 df,然后将这些值连接回相应行中的原始 df。

df = pd.DataFrame({'col1': [1, 2, 3, 4, 5], 
                   'col2': [np.NaN, np.NaN, {'aa': 11, 'bb': 22}, {'aa': 33, 'bb': 44}, {'aa': 55, 'bb': 66}]})
df

    col1 col2
0   1    NaN
1   2    NaN
2   3    {'aa': 11, 'bb': 22}
3   4    {'aa': 33, 'bb': 44}
4   5    {'aa': 55, 'bb': 66}

期望的最终结果是:

    col1    aa      bb
0   1       NaN     NaN
1   2       NaN     NaN
2   3       11      22
3   4       33      44
4   5       55      66

如果我将 col2 传递给 pandas .tolist() 函数,则字典不会被解包。

pd.DataFrame(df['col2'].tolist())

0   NaN
1   NaN
2   {'aa': 11, 'bb': 22}
3   {'aa': 33, 'bb': 44}
4   {'aa': 55, 'bb': 66}

如果我使用 dropna(),则解包字典,但会重置索引

pd.DataFrame(df['col2'].dropna().tolist())

    aa  bb
0   11  22
1   33  44
2   55  66

如果我尝试将索引重置为原始 df 的索引,则行数据会出现在不同的索引位置。

pd.DataFrame(df['col2'].dropna().tolist()).reindex(df.index)

    aa  bb
0   11.0    22.0
1   33.0    44.0
2   55.0    66.0
3   NaN     NaN
4   NaN     NaN

数据是多种多样的,没有办法知道在列中的任何点会有多少 NaN 值。

非常感谢任何帮助。

【问题讨论】:

    标签: python pandas indexing


    【解决方案1】:

    IIUC 通过在dropna 之后传递index 来修复您的代码

    s=df.col2.dropna()
    df=df.join(pd.DataFrame(s.tolist(), index=s.index))
    df
    Out[103]: 
       col1                  col2    aa    bb
    0     1                   NaN   NaN   NaN
    1     2                   NaN   NaN   NaN
    2     3  {'aa': 11, 'bb': 22}  11.0  22.0
    3     4  {'aa': 33, 'bb': 44}  33.0  44.0
    4     5  {'aa': 55, 'bb': 66}  55.0  66.0
    

    【讨论】:

    • 由于最快而接受的答案;在 i7 笔记本电脑上的 Jupyter Notebook 中,每个循环 11.5 毫秒 ± 279 微秒,用于约 5k 项数组。
    【解决方案2】:

    使用Series.to_dict 考虑索引:

    df.join(pd.DataFrame(df['col2'].to_dict()).T).drop(columns='col2')
       col1    aa    bb
    0     1   NaN   NaN
    1     2   NaN   NaN
    2     3  11.0  22.0
    3     4  33.0  44.0
    4     5  55.0  66.0
    

    【讨论】:

      【解决方案3】:

      试试:pd.concat([df['col1'], df['col2'].apply(pd.Series)], axis=1)

         col1    aa    bb
      0     1   NaN   NaN
      1     2   NaN   NaN
      2     3  11.0  22.0
      3     4  33.0  44.0
      4     5  55.0  66.0
      

      【讨论】:

      • 谢谢 - 此解决方案有效,但不如其他解决方案快;在 i7 笔记本电脑上的 Jupyter Notebook 中,每个循环 1.58 秒 ± 40.2 毫秒,用于约 5k 项数组。
      猜你喜欢
      • 2020-11-09
      • 2020-03-29
      • 2016-06-13
      • 2017-04-12
      • 1970-01-01
      • 2015-02-22
      • 2017-02-17
      • 2018-02-04
      • 1970-01-01
      相关资源
      最近更新 更多