Python 循环或迭代数据帧中的列以替换空值
我有一个762106行x 79列的数据帧。共有14个三列“集合”,每列表示给定特征的不同“强度”,NaN表示另一列中有值。它们已经被编码了,我想把它们压缩成一列,这样我就有了14列,而不是42列 可以按如下方式重新创建子集: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],
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与函数一起使用,则会对对象索引的每个值(在本例中为列名)调用它 由于您可以按任何函数分组,因此它可以是一个非常灵活的解决方案