pandas 为什么groupby函数在这种情况下不起作用

v6ylcynt  于 2023-03-21  发布在  其他
关注(0)|答案(3)|浏览(245)

我想做平均值插补汽车价格和平均价格应该基于汽车型号,所以我试图使一个分组函数为我的数据基于汽车型号列的平均值插补,但我得到这个错误:
TypeError:“DataFrameGroupBy”对象不支持项分配
我试过这个

grouped_df = df1.groupby('modele')
def replace_zero_or_1000_with_nan(x):
  x[x == 0.0] = pd.np.nan
  x[x == 1000000.0] = pd.np.nan
  return x

# Use apply() to apply the function to the car_price column of each group
grouped_df['prix_millions'] = grouped_df['prix_millions'].apply(replace_zero_or_1000_with_nan)

# Use transform() to apply the mean value of each car model to the NaN values
imputed_df = grouped_df.transform(lambda x: x.fillna(x.mean()))

我需要使0和10000空值的值,然后将它们替换为基于汽车模型的平均插补,这样这些值就可以是逻辑的。

kupeojn6

kupeojn61#

您可以使用布尔索引将值0和1000替换为组的平均值:

# boolean mask, check where values are 0 and 1000
mask = df['prix_millions'].isin([0, 1000])

# compute the mean for each group
mean_per_group = df.loc[~mask].groupby('modele')['prix_millions'].mean()

# replace 0 and 1000 values by the mean of the group
df.loc[mask, 'prix_millions'] = df['modele'].map(mean_per_group)

输出:

>>> df
   modele  prix_millions
0       1     364.833333
1       1     756.000000
2       1     347.000000
3       1     364.833333
4       1     364.833333
5       1     364.833333
6       1     137.000000
7       1     748.000000
8       1     123.000000
9       1      78.000000

详情:

>>> m
0     True
1    False
2    False
3     True
4     True
5     True
6    False
7    False
8    False
9    False
Name: prix_millions, dtype: bool

>>> mean_per_group
modele
1    364.833333
Name: prix_millions, dtype: float64

输入:

>>> df
   modele  prix_millions
0       1              0
1       1            756
2       1            347
3       1           1000
4       1           1000
5       1              0
6       1            137
7       1            748
8       1            123
9       1             78
k10s72fa

k10s72fa2#

您收到的错误消息“TypeError:“DataFrameGroupBy”对象不支持项分配,因为您试图将值分配给groupby对象,而这是不允许的。
若要解决此问题,在将replace_zero_or_1000_with_nan函数应用于'prix_millions'列时,可以使用transform方法而不是apply。transform方法将一个函数应用于每个组,并返回与原始数据框形状相同的数据框。
下面是更新后的代码:

grouped_df = df1.groupby('modele')

def replace_zero_or_1000_with_nan(x):
  x[x == 0.0] = pd.np.nan
  x[x == 1000000.0] = pd.np.nan
  return x

# Use transform() to apply the function to the car_price column of each group
grouped_df['prix_millions'] = grouped_df['prix_millions'].transform(replace_zero_or_1000_with_nan)

# Use transform() to apply the mean value of each car model to the NaN values
imputed_df = grouped_df.transform(lambda x: x.fillna(x.mean()))

这应该允许您用NaN替换0和10000值,然后将每个汽车模型的平均值代入NaN值。

qnyhuwrf

qnyhuwrf3#

这是因为groupby方法返回DataFrameGroupBy类型,而不是DataFrame。事实上,在替换值之前,你真的需要groupby数据集吗?我认为你可以通过重新排序操作来解决这个问题。

相关问题