使用 python 在数据框中查找缺失值
Find the missing values in data frame using python
A1 A2 A3 B1 B2 B3
aa 1.0 4.0 9 NaN NaN 2.0
bb NaN NaN 9 9.0 2.0 2.0
cc 3.0 2.0 7 1.0 3.0 2.0
dd 4.0 5.0 7 NaN 4.0 5.0
ee 5.0 NaN 1 5.0 1.0 5.0
ff 3.0 5.0 2 5.0 2.0 NaN
我需要根据以下参数填充缺失值(Na):
如果行 (aa, bb, cc, dd, ff) 的任何一列 (A1, A2, A3 或 B1, B2, B3) 有缺失值,则填充缺失值值与其他两行的值的平均值(A1-3 或 B1-3)
例如:(dd:B1) 应该是 (5+4)/2 = 4.5
如果行有两个缺失值属于(A1-A3 或 B1-B3),则用类别(A 或 B)第三列中的可用值填充它
示例:(bb:A1 and bb: A2) == 9 as (bb: A3 is 9)
预期输出:
A1 A2 A3 B1 B2 B3
aa 1.0 4.0 9.0 2.0 2.0 2.0
bb 9.0 9.0 9.0 9.0 2.0 2.0
cc 3.0 2.0 7.0 1.0 3.0 2.0
dd 4.0 5.0 7.0 4.5 4.0 5.0
ee 5.0 3.0 1.0 5.0 1.0 5.0
ff 3.0 5.0 2.0 5.0 2.0 3.5
这里是one-way:
df.replace({'Na':np.nan}).T\
.groupby(df.columns.str[0], group_keys=False)\
.apply(lambda x: x.fillna(x.mean())).T
输出:
A1 A2 A3 B1 B2 B3
aa 1.0 4.0 9.0 2.0 2.0 2.0
bb 9.0 9.0 9.0 9.0 2.0 2.0
cc 3.0 2.0 7.0 1.0 3.0 2.0
dd 4.0 5.0 7.0 4.5 4.0 5.0
ee 5.0 3.0 1.0 5.0 1.0 5.0
ff 3.0 5.0 2.0 5.0 2.0 3.5
详情:
首先,在原始数据框中,有字符串 'Na' 而不是 np.nan。用字典替换'Na' ton np.Nan,我们可以用fillna.
转置数据框,使列变为行,行变为列,这更容易,并且您可以通过对行而不是列进行分组来获得更多功能。使用列的第一个字母 header 通过使用 .str 访问器和切片位置 0 进行分组。接下来,我们可以将 fillna a 与 x 值的平均值一起使用。
首先你可能需要:
df=df.replace({'Na':np.nan})
现在 df 是:
A1 A2 A3 B1 B2 B3
aa 1.0 4.0 9 NaN NaN 2.0
bb NaN NaN 9 9.0 2.0 2.0
cc 3.0 2.0 7 1.0 3.0 2.0
dd 4.0 5.0 7 NaN 4.0 5.0
ee 5.0 NaN 1 5.0 1.0 5.0
ff 3.0 5.0 2 5.0 2.0 NaN
那么你可以使用:
c=df.columns.str.contains('A')
df2=df.T.groupby(c).mean().T
df2.columns=['B','A']
df=pd.concat([df.T[c].fillna(df2['A']),df.T[~c].fillna(df2['B'])]).T
print(df)
A1 A2 A3 B1 B2 B3
aa 1.0 4.0 9.0 2.0 2.0 2.0
bb 9.0 9.0 9.0 9.0 2.0 2.0
cc 3.0 2.0 7.0 1.0 3.0 2.0
dd 4.0 5.0 7.0 4.5 4.0 5.0
ee 5.0 3.0 1.0 5.0 1.0 5.0
ff 3.0 5.0 2.0 5.0 2.0 3.5
A1 A2 A3 B1 B2 B3
aa 1.0 4.0 9 NaN NaN 2.0
bb NaN NaN 9 9.0 2.0 2.0
cc 3.0 2.0 7 1.0 3.0 2.0
dd 4.0 5.0 7 NaN 4.0 5.0
ee 5.0 NaN 1 5.0 1.0 5.0
ff 3.0 5.0 2 5.0 2.0 NaN
我需要根据以下参数填充缺失值(Na):
如果行 (aa, bb, cc, dd, ff) 的任何一列 (A1, A2, A3 或 B1, B2, B3) 有缺失值,则填充缺失值值与其他两行的值的平均值(A1-3 或 B1-3) 例如:(dd:B1) 应该是 (5+4)/2 = 4.5
如果行有两个缺失值属于(A1-A3 或 B1-B3),则用类别(A 或 B)第三列中的可用值填充它 示例:(bb:A1 and bb: A2) == 9 as (bb: A3 is 9)
预期输出:
A1 A2 A3 B1 B2 B3
aa 1.0 4.0 9.0 2.0 2.0 2.0
bb 9.0 9.0 9.0 9.0 2.0 2.0
cc 3.0 2.0 7.0 1.0 3.0 2.0
dd 4.0 5.0 7.0 4.5 4.0 5.0
ee 5.0 3.0 1.0 5.0 1.0 5.0
ff 3.0 5.0 2.0 5.0 2.0 3.5
这里是one-way:
df.replace({'Na':np.nan}).T\
.groupby(df.columns.str[0], group_keys=False)\
.apply(lambda x: x.fillna(x.mean())).T
输出:
A1 A2 A3 B1 B2 B3
aa 1.0 4.0 9.0 2.0 2.0 2.0
bb 9.0 9.0 9.0 9.0 2.0 2.0
cc 3.0 2.0 7.0 1.0 3.0 2.0
dd 4.0 5.0 7.0 4.5 4.0 5.0
ee 5.0 3.0 1.0 5.0 1.0 5.0
ff 3.0 5.0 2.0 5.0 2.0 3.5
详情:
首先,在原始数据框中,有字符串 'Na' 而不是 np.nan。用字典替换'Na' ton np.Nan,我们可以用fillna.
转置数据框,使列变为行,行变为列,这更容易,并且您可以通过对行而不是列进行分组来获得更多功能。使用列的第一个字母 header 通过使用 .str 访问器和切片位置 0 进行分组。接下来,我们可以将 fillna a 与 x 值的平均值一起使用。
首先你可能需要:
df=df.replace({'Na':np.nan})
现在 df 是:
A1 A2 A3 B1 B2 B3
aa 1.0 4.0 9 NaN NaN 2.0
bb NaN NaN 9 9.0 2.0 2.0
cc 3.0 2.0 7 1.0 3.0 2.0
dd 4.0 5.0 7 NaN 4.0 5.0
ee 5.0 NaN 1 5.0 1.0 5.0
ff 3.0 5.0 2 5.0 2.0 NaN
那么你可以使用:
c=df.columns.str.contains('A')
df2=df.T.groupby(c).mean().T
df2.columns=['B','A']
df=pd.concat([df.T[c].fillna(df2['A']),df.T[~c].fillna(df2['B'])]).T
print(df)
A1 A2 A3 B1 B2 B3
aa 1.0 4.0 9.0 2.0 2.0 2.0
bb 9.0 9.0 9.0 9.0 2.0 2.0
cc 3.0 2.0 7.0 1.0 3.0 2.0
dd 4.0 5.0 7.0 4.5 4.0 5.0
ee 5.0 3.0 1.0 5.0 1.0 5.0
ff 3.0 5.0 2.0 5.0 2.0 3.5