据我所知,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中有可能插入这样的行,请告诉我,我该怎么做。谢谢你的帮助。
答案 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))
答案 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
样本数据的时间安排