对于属于与给定元组相同的 class 的所有样本,按属性均值处理 python 中的缺失值?
Handle missing values in python by attribute mean for all samples belonging to the same class as the given tuple?
我有一个很大的住房数据数据库,我需要用同样的方法来填充缺失值class。例如,在 "Bedrooms" 列中,缺失的数据需要由 same/similar 大小和价格的房屋的平均卧室数来填充。尺寸以平方英尺为单位存储在名为 "Area" 的属性中。 Area 和 price 属性有很多不同的值,所以我对如何处理这个问题有点困惑。在 python 中是否有一种简单的方法可以做到这一点?此外,是否将区域组合成区间以减少不同的值并找到每个区间的平均值更合适?
示例数据如下:
location bedrooms Size(sq. ft.) price
abc 7 4500 5.5 Crore
cde 6 2250 2.1 Crore
bda 7 4500 4.75 Crore
abc NA 4500 4.5 Crore
abc 5 2250 2.3 Crore
bda NA 1350 54 Lakh
cde 5 1575 1.6 Crore
bda NA 2452 3.25 Crore
bda 3 1260 95 Lakh
cde 6 2250 2.15 Crore
abc 8 4500 3.5 Crore
您可以使用python中的groupby and transform方法来获得想要的结果。
示例:
d = {'col1': ['a', 'b', 'a', 'a', 'b', 'a'], 'col2': [3, 4, None, 5, None, 7], 'col3':[4,5,6,7,8,6]}
df = pd.DataFrame(data=d)
输出:
col1 col2 col3
0 a 3.0 4
1 b 4.0 5
2 a NaN 6
3 a 5.0 7
4 b NaN 8
5 a 7.0 6
现在使用groupby和transform方法:
df["col2"] = df.groupby("col1").transform(lambda x: x.fillna(x.mean()))
输出
col1 col2 col3
0 a 3.0 4
1 b 4.0 5
2 a 5.0 6
3 a 5.0 7
4 b 4.0 8
5 a 7.0 6
如您所见,col2 中的 Nan 值已替换为 col1 中 class 的平均值。例如,索引二变为 5,即 (3+5+7)/3,索引 4 变为 4,即 4/1。
如果你的情况,如果你想添加多个列作为你的 "grouper",你可以简单地在 groupby 方法中传入更多列来实现。但是,这些只会取所有列中的值 Excatly 相同的值的平均值。在您的情况下,您可以做的是:
df["bedrooms"] = df.groupby(["location","Size(sq. ft.)", "price"]).transform(lambda x: x.fillna(x.mean()))
因此,例如,如果位置为 abc
、尺寸为 4000
且价格为 2000
,它将取这三个值相同的所有值实例的平均值.但是,如果您有一列 abc
,大小为 4000
,价格为 2001
,它不会使用具有相同位置和大小但价格不同的值的平均值.
您需要一个辅助列来定义您的相似性度量,以便使用一系列值的平均值。
我有一个很大的住房数据数据库,我需要用同样的方法来填充缺失值class。例如,在 "Bedrooms" 列中,缺失的数据需要由 same/similar 大小和价格的房屋的平均卧室数来填充。尺寸以平方英尺为单位存储在名为 "Area" 的属性中。 Area 和 price 属性有很多不同的值,所以我对如何处理这个问题有点困惑。在 python 中是否有一种简单的方法可以做到这一点?此外,是否将区域组合成区间以减少不同的值并找到每个区间的平均值更合适?
示例数据如下:
location bedrooms Size(sq. ft.) price
abc 7 4500 5.5 Crore
cde 6 2250 2.1 Crore
bda 7 4500 4.75 Crore
abc NA 4500 4.5 Crore
abc 5 2250 2.3 Crore
bda NA 1350 54 Lakh
cde 5 1575 1.6 Crore
bda NA 2452 3.25 Crore
bda 3 1260 95 Lakh
cde 6 2250 2.15 Crore
abc 8 4500 3.5 Crore
您可以使用python中的groupby and transform方法来获得想要的结果。
示例:
d = {'col1': ['a', 'b', 'a', 'a', 'b', 'a'], 'col2': [3, 4, None, 5, None, 7], 'col3':[4,5,6,7,8,6]}
df = pd.DataFrame(data=d)
输出:
col1 col2 col3
0 a 3.0 4
1 b 4.0 5
2 a NaN 6
3 a 5.0 7
4 b NaN 8
5 a 7.0 6
现在使用groupby和transform方法:
df["col2"] = df.groupby("col1").transform(lambda x: x.fillna(x.mean()))
输出
col1 col2 col3
0 a 3.0 4
1 b 4.0 5
2 a 5.0 6
3 a 5.0 7
4 b 4.0 8
5 a 7.0 6
如您所见,col2 中的 Nan 值已替换为 col1 中 class 的平均值。例如,索引二变为 5,即 (3+5+7)/3,索引 4 变为 4,即 4/1。
如果你的情况,如果你想添加多个列作为你的 "grouper",你可以简单地在 groupby 方法中传入更多列来实现。但是,这些只会取所有列中的值 Excatly 相同的值的平均值。在您的情况下,您可以做的是:
df["bedrooms"] = df.groupby(["location","Size(sq. ft.)", "price"]).transform(lambda x: x.fillna(x.mean()))
因此,例如,如果位置为 abc
、尺寸为 4000
且价格为 2000
,它将取这三个值相同的所有值实例的平均值.但是,如果您有一列 abc
,大小为 4000
,价格为 2001
,它不会使用具有相同位置和大小但价格不同的值的平均值.
您需要一个辅助列来定义您的相似性度量,以便使用一系列值的平均值。