如何在基于条件的dataframe中添加新行?

xhv8bpkk  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(328)

我有一个从文件填充的Dataframe。第一列总是相同的值,第二列是基于尺寸的(我从cam文件中获得了这些值),第三列是由else-if条件创建的。

[1]   [2] [3]
  1     30  2
  1     30  1
  1     30  3
  1     90  3
  1    370  3
  1    430  3
  1    705  3
  1    805  3
  1    880  2
  1    905  3
  1   1005  3
  1   1170  3
  1   1230  3
  1   1970  3
  1   2030  3
  1   2970  3
  1   3030  3
  1   3970  3
  1   4030  3
  1   4423  3
  1   4539  3
  1   4575  3
  1   4630  2
  1   4635  3
  1   4671  3
  1   4787  3
  1   4957  3
  1   5057  3
  1   5270  3
  1   5330  3
  1   5970  3
  1   6030  3
  1   6970  3
  1   7030  3
  1   7970  3
  1   8030  3
  1   8158  3
  1   8257  3
  1   8332  2
  1   8357  3
  1   8457  3
  1   8970  3
  1   9030  3
  1   9970  3
  1  10030  3
  1  10970  3
  1  11030  3
  1  11470  3
  1  11530  3
  1  11853  3
  1  11953  3

现在我需要在计算中创建一个新行。我需要迭代每一行来找到一个大于100的值来添加这样的新行。。以第4行和第5行为例:

1     90  3
  1    370  3
 370 - 90 = 260 (260 is greater than 100)

所以我需要添加一个新行,最后一个数字+100,最后一列必须为零:

1     90  3
  1    190  0
  1    370  3

有什么办法能做到吗?提前谢谢。
编辑:我只需要在Dataframe中添加一次行。

uinbv5nw

uinbv5nw1#

尝试:

m = df["[2]"].diff() > 100

df.loc[m, "[2]"] = pd.Series(
    [
        [str(df.iloc[v - 1]["[2]"] + 100), df.iloc[v]["[2]"]]
        for v in df.index[m]
    ],
    index=df.index[m],
)

df = df.explode("[2]")
df["[3]"] = np.where(
    df["[2]"].apply(lambda x: isinstance(x, str)), 0, df["[3]"]
)
df["[2]"] = df["[2]"].astype(int)
print(df)

印刷品:

[1]    [2]  [3]
0     1     30    2
1     1     30    1
2     1     30    3
3     1     90    3
4     1    190    0
4     1    370    3
5     1    430    3
6     1    530    0
6     1    705    3
7     1    805    3
8     1    880    2
9     1    905    3
10    1   1005    3
11    1   1105    0
11    1   1170    3
12    1   1230    3
13    1   1330    0
13    1   1970    3
14    1   2030    3
15    1   2130    0
15    1   2970    3
16    1   3030    3
17    1   3130    0
17    1   3970    3
18    1   4030    3
19    1   4130    0
19    1   4423    3
20    1   4523    0
20    1   4539    3
21    1   4575    3
22    1   4630    2
23    1   4635    3
24    1   4671    3
25    1   4771    0
25    1   4787    3
26    1   4887    0
26    1   4957    3
27    1   5057    3
28    1   5157    0
28    1   5270    3
29    1   5330    3
30    1   5430    0
30    1   5970    3
31    1   6030    3
32    1   6130    0
32    1   6970    3
33    1   7030    3
34    1   7130    0
34    1   7970    3
35    1   8030    3
36    1   8130    0
36    1   8158    3
37    1   8257    3
38    1   8332    2
39    1   8357    3
40    1   8457    3
41    1   8557    0
41    1   8970    3
42    1   9030    3
43    1   9130    0
43    1   9970    3
44    1  10030    3
45    1  10130    0
45    1  10970    3
46    1  11030    3
47    1  11130    0
47    1  11470    3
48    1  11530    3
49    1  11630    0
49    1  11853    3
50    1  11953    3

编辑:仅更改一个值:

mask = df["[2]"].diff() > 100
if True in mask:
    m = [False] * len(df)
    m[mask.idxmax()] = True

    df.loc[m, "[2]"] = pd.Series(
        [
            [str(df.iloc[v - 1]["[2]"] + 100), df.iloc[v]["[2]"]]
            for v in df.index[m]
        ],
        index=df.index[m],
    )

    df = df.explode("[2]")
    df["[3]"] = np.where(
        df["[2]"].apply(lambda x: isinstance(x, str)), 0, df["[3]"]
    )
    df["[2]"] = df["[2]"].astype(int)
    print(df)

相关问题