[英]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.