Python 循环或迭代数据帧中的列以替换空值

Python 循环或迭代数据帧中的列以替换空值,python,pandas,Python,Pandas,我有一个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],

我有一个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'])
    a   b   c
0   2   1   3
1   1   2   1
2   3   1   2
输出:

    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
我希望它们看起来像这样:

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'])
    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次。

您可以按列名称中的第一个字母进行分组:

您可以与轴=1一起使用(“列”):

如果groupby与函数一起使用,则会对对象索引的每个值(在本例中为列名)调用它

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