如何用每组中出现频率最高的值填充 DataFrame 中的缺失值?
How to fill missing values in a DataFrame with the most frequent value of each group?
我有一个包含两列的 pandas DataFrame:toy
和 color
。 color
列包含缺失值。
如何使用特定 toy
最常见的 color
填充缺失的 color
值?
下面是创建示例数据集的代码:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'toy':['car'] * 4 + ['train'] * 5 + ['ball'] * 3 + ['truck'],
'color':['red', 'blue', 'blue', np.nan, 'green', np.nan,
'red', 'red', np.nan, 'blue', 'red', np.nan, 'green']
})
这是示例数据集:
toy color
0 car red
1 car blue
2 car blue
3 car NaN
4 train green
5 train NaN
6 train red
7 train red
8 train NaN
9 ball blue
10 ball red
11 ball NaN
12 truck green
这是想要的结果:
- 将 第一个 NaN 替换为 blue,因为这是汽车最常见的
color
。
- 将第二个和第三个 NaN 替换为 red,因为这是火车最常见的
color
。
- 用 blue 或 red 替换 fourth NaN,因为它们与最常见的
color
并列球.
关于真实数据集的注释:
- 有许多不同的
toy
类型(不只是四种)。
- 没有
toy
类型只有 color
的缺失值,因此答案不需要处理这种情况。
This question是有关系的,但是没有回答我如何用出现频率最高的值来填充缺失值的问题。
您可以使用groupby()
+transform()
+fillna()
:
df['color']=df['color'].fillna(df.groupby('toy')['color'].transform(lambda x:x.mode().iat[0]))
或
如果想在有 2 个或更多频繁值时 select 随机值:
from random import choice
df['color']=df['color'].fillna(df.groupby('toy')['color'].transform(lambda x:choice(x.mode())))
您想 fillna
与 mode
:
df["color"] = df.groupby("toy")["color"].apply(lambda x: x.fillna(x.mode().iat[0]))
我有一个包含两列的 pandas DataFrame:toy
和 color
。 color
列包含缺失值。
如何使用特定 toy
最常见的 color
填充缺失的 color
值?
下面是创建示例数据集的代码:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'toy':['car'] * 4 + ['train'] * 5 + ['ball'] * 3 + ['truck'],
'color':['red', 'blue', 'blue', np.nan, 'green', np.nan,
'red', 'red', np.nan, 'blue', 'red', np.nan, 'green']
})
这是示例数据集:
toy color
0 car red
1 car blue
2 car blue
3 car NaN
4 train green
5 train NaN
6 train red
7 train red
8 train NaN
9 ball blue
10 ball red
11 ball NaN
12 truck green
这是想要的结果:
- 将 第一个 NaN 替换为 blue,因为这是汽车最常见的
color
。 - 将第二个和第三个 NaN 替换为 red,因为这是火车最常见的
color
。 - 用 blue 或 red 替换 fourth NaN,因为它们与最常见的
color
并列球.
关于真实数据集的注释:
- 有许多不同的
toy
类型(不只是四种)。 - 没有
toy
类型只有color
的缺失值,因此答案不需要处理这种情况。
This question是有关系的,但是没有回答我如何用出现频率最高的值来填充缺失值的问题。
您可以使用groupby()
+transform()
+fillna()
:
df['color']=df['color'].fillna(df.groupby('toy')['color'].transform(lambda x:x.mode().iat[0]))
或
如果想在有 2 个或更多频繁值时 select 随机值:
from random import choice
df['color']=df['color'].fillna(df.groupby('toy')['color'].transform(lambda x:choice(x.mode())))
您想 fillna
与 mode
:
df["color"] = df.groupby("toy")["color"].apply(lambda x: x.fillna(x.mode().iat[0]))