根据列的值在 DataFrame 中填充 NaN
Filling NaN in DataFrame based on the values of a column
我有类似于以下简化示例的数据:
Col1 Col2 Col3
a A 10.1
b A NaN
d B NaN
e B 12.3
f B NaN
g C 14.1
h C NaN
i C NaN
...数千行。我需要根据 Col2 中的值填充 na,使用类似于 ffill 方法的东西。我正在寻找的结果是这样的:
Col1 Col2 Col3
a A 10.1
b A 10.1
d B NaN
e B 12.3
f B 12.3
g C 14.1
h C 14.1
i C 14.1
但是,此方法会忽略 Col2 中的值。有什么想法吗?
这是您要找的吗?
import pandas as pd
import numpy as np
df['Col3'] = np.where(df['Col2'] == 'A', df['Col3'].fillna(10.1), df["Col3"])
当然要相应地替换。
您可以为 Col2
的每个元素获取 DataFrame 的切片,然后连接结果。
>>> pd.concat((df.loc[df.Col2 == letter, :].ffill() for letter in df.Col2.unique()))
Col1 Col2 Col3
0 a A 10.1
1 b A 10.1
2 d B NaN
3 e B 12.3
4 f B 12.3
5 g C 14.1
6 h C 14.1
7 i C 14.1
编辑:@EdChum 提出的方法似乎是迄今为止最快的。
%timeit pd.concat((df.loc[df.Col2 == letter, :].ffill() for letter in df.Col2.unique()))
100 loops, best of 3: 3.57 ms per loop
%timeit df.groupby('Col2').transform('fillna',method='ffill')['Col3']
100 loops, best of 3: 4.59 ms per loop
%timeit df.groupby('Col2')['Col3'].transform(lambda x: x.ffill())
1000 loops, best of 3: 746 µs per loop
我找到的一个答案如下:
df['col3'] = df.groupby('Col2').transform('fillna',method='ffill')['col3']
有什么想法吗?
如果我理解正确,那么您可以在 'Col2' 上分组,然后在 'Col3' 上调用转换并调用 ffill
:
In [35]:
df['Col3'] = df.groupby('Col2')['Col3'].transform(lambda x: x.ffill())
df
Out[35]:
Col1 Col2 Col3
0 a A 10.1
1 b A 10.1
2 d B NaN
3 e B 12.3
4 f B 12.3
5 g C 14.1
6 h C 14.1
7 i C 14.1
我有类似于以下简化示例的数据:
Col1 Col2 Col3
a A 10.1
b A NaN
d B NaN
e B 12.3
f B NaN
g C 14.1
h C NaN
i C NaN
...数千行。我需要根据 Col2 中的值填充 na,使用类似于 ffill 方法的东西。我正在寻找的结果是这样的:
Col1 Col2 Col3
a A 10.1
b A 10.1
d B NaN
e B 12.3
f B 12.3
g C 14.1
h C 14.1
i C 14.1
但是,此方法会忽略 Col2 中的值。有什么想法吗?
这是您要找的吗?
import pandas as pd
import numpy as np
df['Col3'] = np.where(df['Col2'] == 'A', df['Col3'].fillna(10.1), df["Col3"])
当然要相应地替换。
您可以为 Col2
的每个元素获取 DataFrame 的切片,然后连接结果。
>>> pd.concat((df.loc[df.Col2 == letter, :].ffill() for letter in df.Col2.unique()))
Col1 Col2 Col3
0 a A 10.1
1 b A 10.1
2 d B NaN
3 e B 12.3
4 f B 12.3
5 g C 14.1
6 h C 14.1
7 i C 14.1
编辑:@EdChum 提出的方法似乎是迄今为止最快的。
%timeit pd.concat((df.loc[df.Col2 == letter, :].ffill() for letter in df.Col2.unique()))
100 loops, best of 3: 3.57 ms per loop
%timeit df.groupby('Col2').transform('fillna',method='ffill')['Col3']
100 loops, best of 3: 4.59 ms per loop
%timeit df.groupby('Col2')['Col3'].transform(lambda x: x.ffill())
1000 loops, best of 3: 746 µs per loop
我找到的一个答案如下:
df['col3'] = df.groupby('Col2').transform('fillna',method='ffill')['col3']
有什么想法吗?
如果我理解正确,那么您可以在 'Col2' 上分组,然后在 'Col3' 上调用转换并调用 ffill
:
In [35]:
df['Col3'] = df.groupby('Col2')['Col3'].transform(lambda x: x.ffill())
df
Out[35]:
Col1 Col2 Col3
0 a A 10.1
1 b A 10.1
2 d B NaN
3 e B 12.3
4 f B 12.3
5 g C 14.1
6 h C 14.1
7 i C 14.1