熊猫-在熊猫中为每个组插入空白行

时间:2018-08-16 20:22:23

标签: python pandas dataframe

我有一个数据框

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

非常感谢您的帮助

4 个答案:

答案 0 :(得分:3)

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

提供

答案 1 :(得分:2)

也可以{@ {1}} + groupby(单线)

apply

或明确

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

答案 2 :(得分:2)

我的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

答案 3 :(得分:2)

我想有点创意:

(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