我正在尝试解决熊猫问题,但我不知道从哪里开始。
我有一个包含多列的数据框,但对此问题感兴趣的内容如下所示:
df = pd.DataFrame(data = {'subject': [1, 1, 1, 2, 2, 2, 3, 3, 3], 'val': [np.nan, 2, np.nan, np.nan, np.nan, 7, np.nan, np.nan, 10]})
subject val
0 1 NaN
1 1 2.0
2 1 NaN
3 2 NaN
4 2 NaN
5 2 7.0
6 3 NaN
7 3 NaN
8 3 10.0
我想创建第三列,对于每个主题,它具有相应主题的列val值:
subject val total
0 1 NaN 2
1 1 2.0 2
2 1 NaN 2
3 2 NaN 7
4 2 NaN 7
5 2 7.0 7
6 3 NaN 10
7 3 NaN 10
8 3 10.0 10
我知道我能做到
df[['subject', 'val']].dropna()
获取第三列的值,但这会丢失数据框中的所有其他列(每行中的值不同)。
由于
答案 0 :(得分:1)
试试这个,
df['total'] =df.groupby('subject')['val'].transform('sum')
或
df['total2'] =df.groupby('subject')['val'].transform(lambda x:x[x.notnull()].unique()) #this will remove NaN records and give you unique element in each group
输出:
subject val total total2
0 1 NaN 2.0 2.0
1 1 2.0 2.0 2.0
2 1 NaN 2.0 2.0
3 2 NaN 7.0 7.0
4 2 NaN 7.0 7.0
5 2 7.0 7.0 7.0
6 3 NaN 10.0 10.0
7 3 NaN 10.0 10.0
8 3 10.0 10.0 10.0
答案 1 :(得分:1)
使用ffill
和bfill
df['New']=df.groupby('subject').val.apply(lambda x : x.ffill().bfill())
df
Out[257]:
subject val New
0 1 NaN 2.0
1 1 2.0 2.0
2 1 NaN 2.0
3 2 NaN 7.0
4 2 NaN 7.0
5 2 7.0 7.0
6 3 NaN 10.0
7 3 NaN 10.0
8 3 10.0 10.0