根据按不同列分组的最常见值来估算 Pandas 数据框列中的缺失值

问题描述 投票:0回答:1

我尝试将 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'])

我现在完全迷失了。我现在如何估算空值?有没有直接的方法来做到这一点,而不需要所有这些肮脏的中间步骤?

python pandas dataframe group-by null
1个回答
0
投票

您可以使用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)
© www.soinside.com 2019 - 2024. All rights reserved.