我有一个数据框
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
。
非常感谢您的帮助
答案 0 :(得分:3)
concat
与append
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)
apply
和append
[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