创建累积列表熊猫

时间:2020-08-25 13:53:37

标签: python pandas

我有这个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的累积到该行为止。

2 个答案:

答案 0 :(得分:2)

让我们仅尝试使用dropna的ID并删除重复项cumsum的结果,然后删除reindexfillna

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