首页 > 解决方案 > 如何以特殊形式添加一行

问题描述

我有一个pandas.DataFrame表格

index     df      df1

0         0       111
1         1       111
2         2       111
3         3       111
4         0       111
5         2       111
6         3       111
7         0       111
8         2       111
9         3       111
10        0       111
11        1       111
12        2       111
13        3       111
14        0       111
15        1       111
16        2       111
17        3       111
18        1       111
19        2       111
20        3       111

我想创建一个数据框,其中df列重复 0、1、2、3。但是数据中缺少一些东西。我试图通过附加行值来用 0 填充空白。这是我的预期结果:

index     df      df1

0         0       111
1         1       111
2         2       111
3         3       111
4         0       111
5         1       0
6         2       111
7         3       111
8         0       111
9         1       0
10        2       111
11        3       111
12        0       111
13        1       111
14        2       111
15        3       111
16        0       111
17        1       111
18        2       111
19        3       111
20        0       0
21        1       111
22        2       111
23        3       111

我怎样才能做到这一点?

编辑:

如果我的输入如下,我该怎么办?

index     df1      df2

0          0       111
1          1       111
2          2       111
3          3       111
4          0       111
5          3       111
6          1       111
7          2       111

这是我的预期结果:

index  df1   df2

0         0       111
1         1       111
2         2       111
3         3       111
4         0       111
5         1       0
6         2       0
7         3       111
8         0       0       
9         1       111
10        2       111 
11        3       0 

标签: pythonpandas

解决方案


您可以设置自定义分组以检测“df”中增加的数字何时重置为较低(或相等)的值。

然后使用“df”中的唯一值和唯一组的乘积重新索引。

最后,使用fillna/ reset_index/的组合重新处理输出rename_axis

# uncomment below if "index" is not the index
# df = df.set_index('index')

# find positions where "df" resets and make groups
groups = df['df'].diff().le(0).cumsum()

(df.set_index([groups, 'df'], drop=True) # set custom groups and "df" as index
   .reindex(pd.MultiIndex.from_product([groups.unique(),   # reindex with all
                                        range(4),          # combinations
                                       ], names=['group', 'df']))
   .fillna(0, downcast='infer') # set missing values as zero
   .reset_index('df')           # all below to restore a range index
   .reset_index(drop=True)
   .rename_axis('index')
)

输出:

       df  df1
index         
0       0  111
1       1  111
2       2  111
3       3  111
4       0  111
5       1    0
6       2  111
7       3  111
8       0  111
9       1    0
10      2  111
11      3  111
12      0  111
13      1  111
14      2  111
15      3  111
16      0  111
17      1  111
18      2  111
19      3  111
20      0    0
21      1  111
22      2  111
23      3  111

第二个例子的输出:

       df1  df2
index          
0        0  111
1        1  111
2        2  111
3        3  111
4        0  111
5        1    0
6        2    0
7        3  111
8        0    0
9        1  111
10       2  111
11       3    0

推荐阅读