如何pd.fillna(mean()) 根据某列的值变化?
How to pd.fillna(mean()) acccording to a column value which changes?
我有以下数据框:
data/hora
2017-08-18 09:22:33 22162 NaN 65.9 NaN NaN
2017-10-03 11:08:26 22162 NaN 60.5 NaN NaN
2018-02-17 01:45:24 22162 NaN 69.7 NaN NaN
2018-02-17 01:45:55 74034 NaN 67.5 NaN NaN
2018-02-17 01:46:29 74034 NaN 65.4 NaN NaN
2018-02-17 01:47:20 74034 NaN 63.3 NaN NaN
2018-02-17 01:48:35 74034 NaN 61.3 NaN NaN
2018-02-17 01:49:08 17448 NaN 63.4 NaN NaN
2018-02-17 01:49:31 17448 NaN 65.5 NaN NaN
2018-02-17 01:49:55 17448 NaN 67.6 NaN NaN
我要将NaN作为哪一列的平均值填入其中。但是,此值随着 'Machine' 的变化而变化 - 共有三个机器值。
因此,我需要根据 Machine 列值更改的 fillna
。
我试过了:
for i in df:
if i.isin(df.loc[df['Machine'] == '22162']):
df.fillna(df.loc[df['Machine'] == '22162'].mean)
elif i.isin(df.loc[df['Machine'] == '17448']):
df.fillna(df.loc[df['Machine'] == '17448'].mean)
elif i.isin(df.loc[df['Machine'] == '74034']):
df.fillna(df.loc[df['Machine'] == '74034'].mean)
但是没有用。
谢谢!
它有点到处都是硬编码,但它应该可以工作。我将 NaN 列命名为 ['A', 'C', 'D']
data hora machine A B C D
0 2017-08-18 09:22:33 22162 NaN 65.9 NaN NaN
1 2017-10-03 11:08:26 22162 NaN 60.5 NaN NaN
2 2018-02-17 01:45:24 22162 NaN 69.7 NaN NaN
3 2018-02-17 01:45:55 74034 NaN 67.5 NaN NaN
4 2018-02-17 01:46:29 74034 NaN 65.4 NaN NaN
5 2018-02-17 01:47:20 74034 NaN 63.3 NaN NaN
6 2018-02-17 01:48:35 74034 NaN 61.3 NaN NaN
7 2018-02-17 01:49:08 17448 NaN 63.4 NaN NaN
8 2018-02-17 01:49:31 17448 NaN 65.5 NaN NaN
9 2018-02-17 01:49:55 17448 NaN 67.6 NaN NaN
columns = ['A', 'C', 'D']
for clm in columns:
df[clm] = df[clm].fillna(df.machine.map(df.groupby('machine')['B'].mean().to_dict()))
结果
data hora machine A B C D
0 2017-08-18 09:22:33 22162 65.366667 65.9 65.366667 65.366667
1 2017-10-03 11:08:26 22162 65.366667 60.5 65.366667 65.366667
2 2018-02-17 01:45:24 22162 65.366667 69.7 65.366667 65.366667
3 2018-02-17 01:45:55 74034 64.375000 67.5 64.375000 64.375000
4 2018-02-17 01:46:29 74034 64.375000 65.4 64.375000 64.375000
5 2018-02-17 01:47:20 74034 64.375000 63.3 64.375000 64.375000
6 2018-02-17 01:48:35 74034 64.375000 61.3 64.375000 64.375000
7 2018-02-17 01:49:08 17448 65.500000 63.4 65.500000 65.500000
8 2018-02-17 01:49:31 17448 65.500000 65.5 65.500000 65.500000
9 2018-02-17 01:49:55 17448 65.500000 67.6 65.500000 65.500000
可能不是最好的方法,但可以完成工作。
这就是我解决问题的方法:
grupo = df.groupby(df["Machine"])
cada_maquina = list(grupo)
for i in range(3):
cada_maquina[i][1].fillna(cada_maquina[i][1].mean(), inplace=True)
非常感谢您的每一条评论! :D
我有以下数据框:
data/hora
2017-08-18 09:22:33 22162 NaN 65.9 NaN NaN
2017-10-03 11:08:26 22162 NaN 60.5 NaN NaN
2018-02-17 01:45:24 22162 NaN 69.7 NaN NaN
2018-02-17 01:45:55 74034 NaN 67.5 NaN NaN
2018-02-17 01:46:29 74034 NaN 65.4 NaN NaN
2018-02-17 01:47:20 74034 NaN 63.3 NaN NaN
2018-02-17 01:48:35 74034 NaN 61.3 NaN NaN
2018-02-17 01:49:08 17448 NaN 63.4 NaN NaN
2018-02-17 01:49:31 17448 NaN 65.5 NaN NaN
2018-02-17 01:49:55 17448 NaN 67.6 NaN NaN
我要将NaN作为哪一列的平均值填入其中。但是,此值随着 'Machine' 的变化而变化 - 共有三个机器值。
因此,我需要根据 Machine 列值更改的 fillna
。
我试过了:
for i in df:
if i.isin(df.loc[df['Machine'] == '22162']):
df.fillna(df.loc[df['Machine'] == '22162'].mean)
elif i.isin(df.loc[df['Machine'] == '17448']):
df.fillna(df.loc[df['Machine'] == '17448'].mean)
elif i.isin(df.loc[df['Machine'] == '74034']):
df.fillna(df.loc[df['Machine'] == '74034'].mean)
但是没有用。
谢谢!
它有点到处都是硬编码,但它应该可以工作。我将 NaN 列命名为 ['A', 'C', 'D']
data hora machine A B C D
0 2017-08-18 09:22:33 22162 NaN 65.9 NaN NaN
1 2017-10-03 11:08:26 22162 NaN 60.5 NaN NaN
2 2018-02-17 01:45:24 22162 NaN 69.7 NaN NaN
3 2018-02-17 01:45:55 74034 NaN 67.5 NaN NaN
4 2018-02-17 01:46:29 74034 NaN 65.4 NaN NaN
5 2018-02-17 01:47:20 74034 NaN 63.3 NaN NaN
6 2018-02-17 01:48:35 74034 NaN 61.3 NaN NaN
7 2018-02-17 01:49:08 17448 NaN 63.4 NaN NaN
8 2018-02-17 01:49:31 17448 NaN 65.5 NaN NaN
9 2018-02-17 01:49:55 17448 NaN 67.6 NaN NaN
columns = ['A', 'C', 'D']
for clm in columns:
df[clm] = df[clm].fillna(df.machine.map(df.groupby('machine')['B'].mean().to_dict()))
结果
data hora machine A B C D
0 2017-08-18 09:22:33 22162 65.366667 65.9 65.366667 65.366667
1 2017-10-03 11:08:26 22162 65.366667 60.5 65.366667 65.366667
2 2018-02-17 01:45:24 22162 65.366667 69.7 65.366667 65.366667
3 2018-02-17 01:45:55 74034 64.375000 67.5 64.375000 64.375000
4 2018-02-17 01:46:29 74034 64.375000 65.4 64.375000 64.375000
5 2018-02-17 01:47:20 74034 64.375000 63.3 64.375000 64.375000
6 2018-02-17 01:48:35 74034 64.375000 61.3 64.375000 64.375000
7 2018-02-17 01:49:08 17448 65.500000 63.4 65.500000 65.500000
8 2018-02-17 01:49:31 17448 65.500000 65.5 65.500000 65.500000
9 2018-02-17 01:49:55 17448 65.500000 67.6 65.500000 65.500000
可能不是最好的方法,但可以完成工作。
这就是我解决问题的方法:
grupo = df.groupby(df["Machine"])
cada_maquina = list(grupo)
for i in range(3):
cada_maquina[i][1].fillna(cada_maquina[i][1].mean(), inplace=True)
非常感谢您的每一条评论! :D