如何在特定条件下在数据框中插入行?

时间:2017-03-16 16:55:21

标签: python pandas dataframe row

据我所知,pandas旨在加载完全填充的数据帧,但我想在特定条件下将单行添加到数据帧。以下是我正在处理的事情

       ProjID      Xcoord      Ycoord
    0  2           some_val    some_val
    1  2           some_val    some_val
    2  2           some_val    some_val
    3  2           some_val    some_val
    4  2           some_val    some_val
    5  3           some_val    some_val
    6  3           some_val    some_val
    7  5           some_val    some_val
    8  5           some_val    some_val
    9  5           some_val    some_val

我想要的是每当ProjID改变时,在df中为每列插入一行值为0。以下是必需的df:

      ProjID      Xcoord      Ycoord
    0  2           some_val    some_val
    1  2           some_val    some_val
    2  2           some_val    some_val
    3  2           some_val    some_val
    4  2           some_val    some_val
    5  0           0           0 
    6  3           some_val    some_val
    7  3           some_val    some_val
    8  0           0           0 
    9  5           some_val    some_val
   10  5           some_val    some_val
   11  5           some_val    some_val
   12  0           0           0

每次都会插入一个带0值的行,ProjID会发生变化。 我试图编写一个for循环,其中ProjID col中的值与ProjID col的前一行值一起检查,如果它们相同,那么它将向前移动,如果它们不相同,那么它应该插入一行所有0值。但是,我无法实现它。另外,我不知道索引列的行为方式。

如果df中有可能插入这样的行,请告诉我,我该怎么做。谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

您可以通过 ProjID 对数据框进行分组,并使用append方法在最后向每个子数据框插入一行,这假设所有相同的ProjID都有事先一起排序:

(df.groupby("ProjID", group_keys=False)
   .apply(lambda g: g.append(pd.Series(0, g.columns), ignore_index=True))
   .reset_index(drop=True))

enter image description here

答案 1 :(得分:2)

我决定在@Psidom之后找到一个不同的答案,我想到了同样的答案,他更快。所以,为了让自己感觉更好,我想出了以下答案。

我和@ Psidom的区别。使用groupby时,所有ProjID将被组合在一起,即使它们不是彼此相邻。如果他们总是希望彼此相邻,那么无关紧要。但是,如果您想将111222111计为两个单独的更改,则此解决方案会考虑到这一点。

pidv = df.ProjID.values
pid_chg = np.append(pidv[:-1] != pidv[1:], True)

i = df.index.repeat(pid_chg + 1)

d1 = df.loc[i, :].copy()

d1.loc[i.duplicated()] = 0

d1.reset_index(drop=True)

    ProjID    Xcoord    Ycoord
0        2  some_val  some_val
1        2  some_val  some_val
2        2  some_val  some_val
3        2  some_val  some_val
4        2  some_val  some_val
5        0         0         0
6        3  some_val  some_val
7        3  some_val  some_val
8        0         0         0
9        5  some_val  some_val
10       5  some_val  some_val
11       5  some_val  some_val
12       0         0         0

样本数据的时间安排

enter image description here