繁体   English   中英

循环或迭代 DataFrame 中的列以替换 null 值

[英]Loop or iterate through columns in a DataFrame to replace null values

我有一个 dataframe 是 762106 行 x 79 列。 有 14 个“集合”,每列表示给定特征的不同“强度”级别,每列表示给定特征的不同级别,而 NaN 表示另一列中有值。 它们已经编码,我想将它们压缩成一列,这样我就有 14 列而不是 42 列。

可以像这样重新创建子集:

import pandas as pd
import numpy as np    
df = pd.DataFrame([[np.nan, 2, np.nan, 1, np.nan, np.nan, np.nan, np.nan, 3],
                    [1, np.nan, np.nan, np.nan, 2, np.nan, 1, np.nan, np.nan],
                    [np.nan, np.nan, 3, 1, np.nan, np.nan, np.nan, 2, np.nan]],
                   columns=['a','aa','aaa','b','bb','bbb','c','cc','ccc'])

Output:

    a       aa      aaa     b       bb      bbb     c       cc      ccc
0   NaN     2.0     NaN     1.0     NaN     NaN     NaN     NaN     3.0
1   1.0     NaN     NaN     NaN     2.0     NaN     1.0     NaN     NaN
2   NaN     NaN     3.0     1.0     NaN     NaN     NaN     2.0     NaN

我希望它们看起来像这样:

    a   b   c
0   2   1   3
1   1   2   1
2   3   1   2

我目前的解决方案是使用.fillna()从 aa、aaa 等中获取值,然后使用.drop()删除多余的列:

df['a'] = df['a'].fillna(df['aa']).fillna(df['aaa'])
df = df.drop(['aa','aaa'],axis = 1)
    
df['b'] = df['b'].fillna(df['bb']).fillna(df['bbb'])
df = df.drop(['bb','bbb'],axis = 1)

这可行,但我想知道是否有更优雅的方法来完成此操作,而无需复制粘贴此代码块 14 次。

您可以使用pandas.DataFrame.groupby axis = 1 (“列”):

df.groupby(lambda x: x[0], axis = 1).sum()
     a    b    c
0  2.0  1.0  3.0
1  1.0  2.0  1.0
2  3.0  1.0  2.0

如果 groupby 与 function 一起使用,它会在对象索引的每个值上调用,在这种情况下,是列名。

由于您可以按任何 function 进行分组,因此它可以是一个非常灵活的解决方案。

您可以使用GroupBy.first按列名称中的第一个字母进行分组:

df = df.groupby(df.columns.str[0], axis=1).first()
print (df)
     a    b    c
0  2.0  1.0  3.0
1  1.0  2.0  1.0
2  3.0  1.0  2.0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM