用其他列值填充 NaN 列,复制新行

Posted

技术标签:

【中文标题】用其他列值填充 NaN 列,复制新行【英文标题】:Fill NaN Column with Other Column Values, Duplicates New Row 【发布时间】:2018-06-22 17:33:36 【问题描述】:

我有一些令人费解的操作要尝试在具有以下一般形式的数据集上高效完成:

id,date,ind_1,ind_2,ind_3,ind_4
1,2014-01-01,ind_1,NaN,NaN,NaN
2,2014-01-02,ind_1,NaN,ind_3,NaN
3,2014-01-03,ind_1,ind_2,ind_3,NaN

我试图弄清楚如何创建一个新列“ind_all”,该列填充任何非空“ind”列。这很简单。我可以使用 .idxmax()。然而,棘手的部分是我每行可以有多个“ind”。这意味着当有重复时我需要创建一个新记录。上面的例子最终应该是这样的:

id,date,ind_1,ind_2,ind_3,ind_4,ind_all
1,2014-01-01,ind_1,NaN,NaN,NaN,ind_1
2,2014-01-02,ind_1,NaN,ind_3,NaN,ind_1
2,2014-01-02,ind_1,NaN,ind_3,NaN,ind_3
3,2014-01-03,ind_1,ind_2,ind_3,NaN,ind_1
3,2014-01-03,ind_1,ind_2,ind_3,NaN,ind_2
3,2014-01-03,ind_1,ind_2,ind_3,NaN,ind_3

任何提示或技巧都将一如既往地受到赞赏!

【问题讨论】:

为什么要回滚对问题的编辑? 请参阅this post 关于不添加名义标签的信息,因为标签已经附加到 SO 数据库内部的标题中(以便 google 更好地索引)。此外,“Python PANDAS”有点怪诞的前缀子字符串。并且numpy标签也与你的问题无关。 我实际上让我的编辑通过修复示例数据中的 id 字段。然后有人提议将问题标题格式更改为我发现不太有用的东西,我不小心接受了,然后我回滚了。 哦,我看你解释了。我会牢记这一点,继续推进命名约定。 好吧,别担心,很高兴你能理解 :) 【参考方案1】:

有一个基于merge 的解决方案使用melt/stack 来构建RHS。

v = (df.drop('date', 1)
       .melt('id')
       .drop('variable', 1)
       .dropna()
       .rename('value' : 'ind_all', axis=1)
)

df.merge(v)

   id        date  ind_1  ind_2  ind_3  ind_4 ind_all
0   1  2014-01-01  ind_1    NaN    NaN    NaN   ind_1
1   2  2014-01-02  ind_1    NaN  ind_3    NaN   ind_1
2   2  2014-01-02  ind_1    NaN  ind_3    NaN   ind_3
3   3  2014-01-03  ind_1  ind_2  ind_3    NaN   ind_1
4   3  2014-01-03  ind_1  ind_2  ind_3    NaN   ind_2
5   3  2014-01-03  ind_1  ind_2  ind_3    NaN   ind_3

或者,

df.merge(df.drop('date', 1)
           .set_index('id')
           .stack()
           .reset_index(1, drop=True)
           .to_frame('ind_all'), 
         left_on='id', 
         right_index=True
)

   id        date  ind_1  ind_2  ind_3  ind_4 ind_all
0   1  2014-01-01  ind_1    NaN    NaN    NaN   ind_1
1   2  2014-01-02  ind_1    NaN  ind_3    NaN   ind_1
1   2  2014-01-02  ind_1    NaN  ind_3    NaN   ind_3
2   3  2014-01-03  ind_1  ind_2  ind_3    NaN   ind_1
2   3  2014-01-03  ind_1  ind_2  ind_3    NaN   ind_2
2   3  2014-01-03  ind_1  ind_2  ind_3    NaN   ind_3

【讨论】:

感谢您的出色解决方案和及时响应。我会检查哪个对我来说跑得更快。

以上是关于用其他列值填充 NaN 列,复制新行的主要内容,如果未能解决你的问题,请参考以下文章

无法用所有列中的列值填充缺失值

Pandas 用 NaN 值填充列中的单元格,从行中的其他单元格中获取值

SQL - 在填充另一列时继承派生列值

熊猫填充列值以具有其他列的相似值

通过检测 NaN 出现的位置,通过其他列的数学运算将 NaN 填充到列中

删除 NaN 和列值更改之间的行