我尝试将 A 列中的缺失值与同一列中最常见的值进行插补,但这取决于它与 B 列的分组方式。 让他们更好地解释一下:
这是我的数据框的一部分:
col_A col_B
8 31
7 30
20 83
NaN 5
8 31
9 34
37 158
... ...
如果我做了
df.groupby(['Col_B','Col_A']).size()
,我就会明白:
col_A col_B
1 8 1
5 1 10
5 2
7 6
8 5
6 8 1
... ... ...
因此,如果我的 A 列有缺失值,而 B 列有 5,我想估算“1”,因为它是 B 列中 A 列中的 5 最常见的值。
我获得了一个单独的数据框,其解释关系如下:
indx_lst=df.groupby(['Col_B','Col_A']).size().to_frame().index.to_list()
A_list=[]
B_list=[]
for i in indx_lst:
x,y=i[0],i[1]
if x in B_list:
pass
else:
B_list.append(x)
A_list.append(y)
A_col_null_imput=pd.DataFrame(np.column_stack([B_list,A_list]),columns=['B_most_freq','A_imputer'])
我现在完全迷失了。我现在如何估算空值?有没有直接的方法来做到这一点,而不需要所有这些肮脏的中间步骤?
您可以使用groupby以及transform和fillna来实现此目的,而无需创建单独的DataFrame。
这是一个例子:
import pandas as pd
import numpy as np
# Sample DataFrame
data = {'col_A': [8, 7, 20, np.nan, 8, 9, 37],
'col_B': [31, 30, 83, 5, 31, 34, 158]}
df = pd.DataFrame(data)
# Define a function to impute NaN values with the most frequent value in the group
def impute_most_frequent(group):
mode_value = group.mode().iloc[0] if not group.mode().empty else np.nan
return group.fillna(mode_value)
# Apply the function to col_A grouped by col_B
df['col_A_imputed'] = df.groupby('col_B')['col_A'].transform(impute_most_frequent)
print(df)