【问题标题】:How to fill NaN values based on the top and bottom strings with highest frequency如何根据最高频率的顶部和底部字符串填充 NaN 值
【发布时间】:2022-01-19 18:38:46
【问题描述】:

我有一个 dataframe 的字符串值,其中缺少值。它需要由以下条件填充/填充。

  • NaN 值索引中,检查最后 3 行和后 3 行,并将 NaN 替换为 6 行中最频繁/重复的值。
  • 如果最后 3 行和后 3 行中出现频率相等的 2 个字符串,请将 NaN 替换为这 6 行中索引最低的值。

我的DataFrame

     reading
0       talk
1       kill
2        NaN
3   vertical
4       type
5       kill
6        NaN
7   vertical
8   vertical
9       type
10   durable
11       NaN
12   durable
13  vertical

预期输出:

     reading
0       talk
1       kill
2       kill
3   vertical
4       type
5       kill
6   vertical
7   vertical
8   vertical
9       type
10   durable
11  vertical
12   durable
13  vertical

这是最小可重现代码:

import pandas as pd
import numpy as np

df = pd.DataFrame({'reading':['talk','kill',np.NAN,'vertical','type','kill',np.NAN,'vertical','vertical','type','durable',np.NAN,'durable','vertical']}) 

def filldf(df):
    # Do the logic here
    return df

我不确定如何解决这个问题。任何帮助将不胜感激!

【问题讨论】:

  • 逻辑不清楚,请详解
  • 基本上,NaN 应该根据 NaN 索引中的前 3 个值和后 3 个值填充,我为此添加了条件。
  • 你是指 NaN 行的“最后 3 行”和“下 3 行”吗?例如,如果 NaN 出现在第 5 行,您想查看第 2 行 - 第 4 行和第 6 行 - 第 8 行的值?然后找出这 6 行中出现频率最高的值?
  • 正是@Emma。你是对的。
  • “First”和“Last”仍然令人困惑。请使用“NaN 行的最后 3 行和下 3 行”进行编辑。

标签: python-3.x pandas missing-data


【解决方案1】:

如果您没有太多 NaN 值,您可以遍历 NaN“读取”值的索引,并简单地查找它周围 6 个值的 mode(使用 iloc 来获取第一个出现多种模式)并将值分配回相应的“NaN”值

msk = df['reading'].isna()
df.loc[msk, 'reading'] = [df.loc[min(0, i-3):i+3, 'reading'].mode().iloc[0] for i in  df.index[msk]]

输出:

     reading
0       talk
1       kill
2       kill
3   vertical
4       type
5       kill
6   vertical
7   vertical
8   vertical
9       type
10   durable
11  vertical
12   durable
13  vertical

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 2017-08-21
    • 2019-12-29
    • 1970-01-01
    • 2021-11-02
    • 2015-05-23
    相关资源
    最近更新 更多