【问题标题】:Pandas - Insert blank row for each group in pandasPandas - 为 pandas 中的每个组插入空白行
【发布时间】:2018-08-17 05:18:42
【问题描述】:

我有一个数据框

import pandas as pd
import numpy as np
df1=pd.DataFrame({'group':[1,1,2,2,2],
             'value':[2,3,np.nan,5,4]})
df1

    group   value
0   1       2
1   1       3
2   2       NaN
3   2       5
4   2       4

我想在 value 的值为 NaN 的每个组之后添加一行。期望的输出是:

   group   value
0   1       2
1   1       3
2   1       NaN
3   2       NaN
4   2       5
5   2       4
6   2       NaN

在我的真实数据集中,除了value 之外,我还有很多组和更多列,我希望它们在新添加的行中都是NaN

非常感谢您的帮助

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    concatappend

    s = df1.groupby('group')
    out = pd.concat([i.append({'value': np.nan}, ignore_index=True) for _, i in s])
    out.group = out.group.ffill().astype(int)
    

    applyappend[1]

    df1.groupby('group').apply(
        lambda d: d.append({'group': d.name}, ignore_index=True).astype({'group': int})
    ).reset_index(drop=True)
    

    两者都产生:

       group  value
    0      1    2.0
    1      1    3.0
    2      1    NaN
    3      2    NaN
    4      2    5.0
    5      2    4.0
    6      2    NaN
    

    [1]这个解决方案由您当地的@piRSquared提供给您

    【讨论】:

    • df1.groupby('group').apply(lambda d: d.append({'group': d.name}, ignore_index=True)).reset_index(drop=True)
    • 这很干净:)
    • 我可以看到它有效,但如何? .apply(lambda d: ....) 不是在个别小组上完成,而不是涓涓细流吗?
    • lambda 方法将我所有的布尔值和整数更改为浮点数。
    【解决方案2】:

    也可以只groupby+apply,单线

    df.groupby('group').apply(lambda gr: gr.append(gr.tail(1).assign(value=np.nan))).reset_index(drop=True)
    

    或者是明确的

    g = df.groupby('group')
    def f(gr):
        n = gr.tail(1).copy()
        n.value = np.nan
        return gr.append(n)
    g.apply(f).reset_index(drop=True)
    
    
        group   value
    0   1       2.0
    1   1       3.0
    2   1       NaN
    3   2       NaN
    4   2       5.0
    5   2       4.0
    6   2       NaN
    

    【讨论】:

      【解决方案3】:

      我的concat版本

      ii = dict(ignore_index=True)
      pd.concat([
          d.append({'group': n}, **ii) for n, d in df1.groupby('group')
      ], **ii).astype({'group': int})
      
         group  value
      0      1    2.0
      1      1    3.0
      2      1    NaN
      3      2    NaN
      4      2    5.0
      5      2    4.0
      6      2    NaN
      

      【讨论】:

        【解决方案4】:

        我想有点创意:

        (pd.concat([df1, 
                    df1.groupby('group')['value'].apply(lambda x: x.shift(-1).iloc[-1]).reset_index()])
            .sort_values('group')
            .reset_index(drop=True))
        

        输出:

           group  value
        0      1    2.0
        1      1    3.0
        2      1    NaN
        3      2    NaN
        4      2    5.0
        5      2    4.0
        6      2    NaN
        

        【讨论】:

        • 好奇 OP 的数据集上的时间安排是什么样的。
        猜你喜欢
        • 2021-06-02
        • 1970-01-01
        • 1970-01-01
        • 2018-04-19
        • 2019-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多