Python - 根据标识符列用前几行的值填充 NA
Python - fill NA by value from previous rows based on identifier column
我想在 2 列中填写缺失值。有 Date 和 Cat2 应根据预定义 Cat1(在先前填充的行中预定义)的最后日期填充另一行的值,例如:
数据示例:
Day Date Cat1 Cat2
1 31/12/17 cat mouse
2 01/09/18 cat mouse
3 27/05/18 dog elephant
4 NaN cat NaN
5 NaN cat NaN
因此,Date
列的 NaN
应根据 Cat1
列 - 01/09/18
中 cat
值的最后存在日期进行填充。 Cat2
列中的 NaN
应由 mouse
填充为已为 Date
- 01/09/18
选择的行中的定义值。
我读到循环遍历每一行是非常糟糕的做法,最好以一种方式完成所有事情。
我会很感激任何 idea.Thanks)
我尝试通过 fillna
方法来完成,但它填充了最后一个值,没有条件用于 Cat1。
data.fillna(method='ffill', inplace = True)
实际结果是:
Day Date Cat1 Cat2
1 31/12/17 cat mouse
2 01/09/18 cat mouse
3 27/05/18 dog elephant
4 27/05/18 cat elephant
5 27/05/18 cat elephant
预期结果应为:
Day Date Cat1 Cat2
1 31/12/17 cat mouse
2 01/09/18 cat mouse
3 27/05/18 dog elephant
4 01/09/18 cat mouse
5 01/09/18 cat mouse
我相信您需要 GroupBy.ffill
with DataFrame.reindex
才能获得与原始订单相同的订单 DataFrame
:
df = df.groupby('Cat1').ffill().reindex(df.columns, axis=1)
print (df)
Day Date Cat1 Cat2
0 1 31/12/17 cat mouse
1 2 01/09/18 cat mouse
2 3 27/05/18 dog elephant
3 4 01/09/18 cat mouse
4 5 01/09/18 cat mouse
此外,替代方法是:
data = data.groupby(['Cat1'], as_index = False).apply(lambda group: group.ffill())
谢谢@Jezrael 的解决方案:)
你可以使用字典:
dict = df[['cat','cat2']].drop_duplicates(keep='first', inplace=False).to_dict()
df['cat2'] = df['cat1'].replace(dict)
对于 timeseries-column,您可以使用 timedelta(线性外推)。祝你好运!
我想在 2 列中填写缺失值。有 Date 和 Cat2 应根据预定义 Cat1(在先前填充的行中预定义)的最后日期填充另一行的值,例如:
数据示例:
Day Date Cat1 Cat2
1 31/12/17 cat mouse
2 01/09/18 cat mouse
3 27/05/18 dog elephant
4 NaN cat NaN
5 NaN cat NaN
因此,Date
列的 NaN
应根据 Cat1
列 - 01/09/18
中 cat
值的最后存在日期进行填充。 Cat2
列中的 NaN
应由 mouse
填充为已为 Date
- 01/09/18
选择的行中的定义值。
我读到循环遍历每一行是非常糟糕的做法,最好以一种方式完成所有事情。
我会很感激任何 idea.Thanks)
我尝试通过 fillna
方法来完成,但它填充了最后一个值,没有条件用于 Cat1。
data.fillna(method='ffill', inplace = True)
实际结果是:
Day Date Cat1 Cat2
1 31/12/17 cat mouse
2 01/09/18 cat mouse
3 27/05/18 dog elephant
4 27/05/18 cat elephant
5 27/05/18 cat elephant
预期结果应为:
Day Date Cat1 Cat2
1 31/12/17 cat mouse
2 01/09/18 cat mouse
3 27/05/18 dog elephant
4 01/09/18 cat mouse
5 01/09/18 cat mouse
我相信您需要 GroupBy.ffill
with DataFrame.reindex
才能获得与原始订单相同的订单 DataFrame
:
df = df.groupby('Cat1').ffill().reindex(df.columns, axis=1)
print (df)
Day Date Cat1 Cat2
0 1 31/12/17 cat mouse
1 2 01/09/18 cat mouse
2 3 27/05/18 dog elephant
3 4 01/09/18 cat mouse
4 5 01/09/18 cat mouse
此外,替代方法是:
data = data.groupby(['Cat1'], as_index = False).apply(lambda group: group.ffill())
谢谢@Jezrael 的解决方案:)
你可以使用字典:
dict = df[['cat','cat2']].drop_duplicates(keep='first', inplace=False).to_dict()
df['cat2'] = df['cat1'].replace(dict)
对于 timeseries-column,您可以使用 timedelta(线性外推)。祝你好运!