填充数据帧不连续列

时间:2018-06-27 10:20:24

标签: python pandas

我有以下数据框:

   Name   B  C  D  E
1   A     1  2  2  7
2   A     7  1  1  7
3   B     1  1  3  4
4   B     2  1  3  4
5   B     3  1  3  4

我想做的是获取一个新的数据框,对于具有相同“名称”的行,“ B”列中的元素是连续的,因此在此示例中,对于“名称” =的行A,数据框必须填充1到7之间的元素,并且C,D,E列的值应为0。

   Name   B  C  D  E
1   A     1  2  2  7
2   A     2  0  0  0
3   A     3  0  0  0
4   A     4  0  0  0
5   A     5  0  0  0
6   A     6  0  0  0
7   A     7  0  0  0
8   B     1  1  3  4
9   B     2  1  5  4
10  B     3  4  3  6

到目前为止,我所做的是将同一“名称”的B列值转换为连续值:

 new_idx = df_.groupby('Name').apply(lambda x: np.arange(x.index.min(), x.index.max() + 1)).apply(pd.Series).stack()

并使用此新系列重新索引原始df(将集合B作为索引),但是我在使用重复项重新索引时遇到了麻烦。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以使用:

def f(x):
    a = np.arange(x.index.min(), x.index.max() + 1)
    x = x.reindex(a, fill_value=0)
    return (x)

new_idx = (df.set_index('B')
            .groupby('Name')
            .apply(f)
            .drop('Name', 1)
            .reset_index()
            .reindex(columns=df.columns))
print (new_idx)
  Name  B  C  D  E
0    A  1  2  2  7
1    A  2  0  0  0
2    A  3  0  0  0
3    A  4  0  0  0
4    A  5  0  0  0
5    A  6  0  0  0
6    A  7  1  1  7
7    B  1  1  3  4
8    B  2  1  3  4
9    B  3  1  3  4