我有这个DataFrame
lst = [[1,0],[None,1],[2,0],[2,0],[None,1],[None,1],[3,0],[None,1] ]
df1 = pd.DataFrame(lst,columns = ['id','is_cumulative'])
输出
id is_cumulative
0 1.0 0
1 NaN 1
2 2.0 0
3 2.0 0
4 NaN 1
5 NaN 1
6 3.0 0
7 NaN 1
我想将NaN值替换为id
列的累积列表
id is_cumulative
0 1 0
1 [1] 1
2 2 0
3 2 0
4 [1, 2] 1
5 [1, 2] 1
6 3 0
7 [1, 2, 3] 1
一些解释:-凡is_cumulative
值为1的地方,我们就拥有id
列的NaN值,因为我们需要计算ID的累积列表来替换它。
数据就像新的ID一样,比以前所有ID的累积到现在为止,再到新的ID和所有ID的累积到该行为止。
答案 0 :(得分:2)
让我们仅尝试使用dropna
的ID并删除重复项cumsum
的结果,然后删除reindex
和fillna
s = (df1.id.dropna().drop_duplicates().astype(str)+',').cumsum().str[:-1].str.split(',').reindex(df1.index).ffill()
df1.id = df1.id.fillna(s)
df1
Out[425]:
id is_cumulative
0 1 0
1 [1.0] 1
2 2 0
3 2 0
4 [1.0, 2.0] 1
5 [1.0, 2.0] 1
6 3 0
7 [1.0, 2.0, 3.0] 1
答案 1 :(得分:2)
这是一种方法:
df1['id'] = df1['id'].fillna(df1['id'].dropna().drop_duplicates()
.astype(int) #this might not be necessary
.apply(lambda x: [x]).cumsum()
.reindex(df1.index, method='ffill'))
print(df1)
id is_cumulative
0 1 0
1 [1] 1
2 2 0
3 2 0
4 [1, 2] 1
5 [1, 2] 1
6 3 0
7 [1, 2, 3] 1