【问题标题】:Fill in missing values based on series and populate second row based on previous or next row根据序列填充缺失值并根据上一行或下一行填充第二行
【发布时间】:2020-03-14 15:44:27
【问题描述】:

我有一个 4 列的 csv。该文件包含一些基于系列的缺失行。

输入:-

No  A   B   C
1   10  50  12
3   40  50  12
4   20  60  15
6   80  80  18

输出:-

No  A   B   C
1   10  50  12
2   10  50  12
3   40  50  12
4   20  60  15
5   20  60  15
6   80  80  18

我需要 python 和 pandas 代码来生成上述输出。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    如果No 是列,则使用 - 通过NoDataFrame.reindex 通过range 使用所有可能的值创建索引:

    v = range(df['No'].min(), df['No'].max() + 1)
    df1 = df.set_index('No').reindex(v, method='ffill').reset_index()
    print (df1)
       No   A   B   C
    0   1  10  50  12
    1   2  10  50  12
    2   3  40  50  12
    3   4  20  60  15
    4   5  20  60  15
    5   6  80  80  18
    

    如果No是索引解决方案稍微改变时使用:

    v = range(df.index.min(), df.index.max() + 1)
    df1 = df.reindex(v, method='ffill')
    print (df1)
         A   B   C
    No            
    1   10  50  12
    2   10  50  12
    3   40  50  12
    4   20  60  15
    5   20  60  15
    6   80  80  18
    

    【讨论】:

    • 当我使用这个语句时 v = range(df['No'].min(), df['No'].max() + 1) 它给了我错误类型错误: “列”对象不可调用
    • @ankitsaxena - 你使用pyspark 吗?
    • 它给出这个输出列
    • @ankitsaxena - 所以问题是我的解决方案适用于 pandas,而不适用于 pyspark。问题是你忘记了标签pyspark,所以两个答案都是针对熊猫的。
    • 那么您能否也为 pyspark 提供此解决方案。谢谢
    【解决方案2】:

    为缺失的行创建一个数据框

    missing_list = [[i] + [pd.np.nan]*(df.shape[1] - 1) for i in range(df.No.min(), df.No.max()) if i not in df.No]
    missing_df = pd.DataFrame(missing_list, columns=df.columns)
    

    连接到原始数据框,排序和前向填充

    pd.concat([df, missing_df]).sort_values('No').ffill()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-02
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 2017-12-24
      • 1970-01-01
      相关资源
      最近更新 更多