pandas:循环行以更新列值

hts6caw3  于 2021-09-08  发布在  Java
关注(0)|答案(2)|浏览(310)

下面是示例数据框,如下所示:

>>> df
  point    x      y
0  0.1   NaN    NaN
1  0.2   NaN    NaN
2  0.3   5.0    NaN
3  0.4   NaN    NaN
4  0.5   NaN    1.0
5  0.6   NaN    NaN
6  0.7   1.0    1.0
7  0.8   NaN    NaN
8  0.9   NaN    NaN
9  1.1   NaN    NaN
10 1.2   NaN    NaN
11 1.3   NaN    NaN
12 1.4   NaN    2.0
13 1.5   NaN    NaN
14 1.6   NaN    NaN
15 1.7   NaN    NaN
16 0.1   NaN    NaN
17 0.2   NaN    NaN
18 0.3   NaN    NaN
19 0.4   NaN    NaN
20 0.5   NaN    NaN
21 0.6   2.0    NaN
22 0.7   NaN    NaN
23 1.1   NaN    NaN

我想从这个数据框中更新 point 价值条件是 xy 不是 NaN 的紧接下一个值 point 将由以前的 point 下一个点值之后的值应重新编制索引(循环.1至.6)。例如,行内索引(2)在 point=0.3, x=5.0 那么,接下来呢 point 值也应为0.3而不是0.4,则行内索引(4)点=0.5将替换为0.4(递归继续)
我想要的输出:

point    x      y
0  0.1   NaN    NaN
1  0.2   NaN    NaN
2  0.3   5.0    NaN
3  0.3   NaN    NaN
4  0.4   NaN    1.0
5  0.4   NaN    NaN
6  0.5   1.0    1.0
7  0.5   NaN    NaN
8  0.6   NaN    NaN
9  1.1   NaN    NaN
10 1.2   NaN    NaN
11 1.3   NaN    NaN
12 1.4   NaN    2.0
13 1.4   NaN    NaN
14 1.5   NaN    NaN
15 1.6   NaN    NaN
16 0.1   NaN    NaN
17 0.2   NaN    NaN
18 0.3   NaN    NaN
19 0.4   NaN    NaN
20 0.5   NaN    NaN
21 0.6   2.0    NaN
22 0.6   NaN    NaN
23 1.1   NaN    NaN

我试过的代码:

import pandas as pd
df = pd.read_csv("data.csv")
df['point'] = df.groupby() #Don't know how should I approach
gev0vcfq

gev0vcfq1#

你能试试吗

mask = df[['x', 'y']].any(axis=1).shift(1, fill_value=False)
point = df['point'].astype(int)
group = point.sub(point.shift(1)).ne(0).cumsum()

df['point'] = df['point'].sub(mask.groupby(group).cumsum().div(10))
>>> df
    point    x    y
0     0.1  NaN  NaN
1     0.2  NaN  NaN
2     0.3  5.0  NaN
3     0.3  NaN  NaN
4     0.4  NaN  1.0
5     0.4  NaN  NaN
6     0.5  1.0  1.0
7     0.5  NaN  NaN
8     0.6  NaN  NaN
9     1.1  NaN  NaN
10    1.2  NaN  NaN
11    1.3  NaN  NaN
12    1.4  NaN  2.0
13    1.4  NaN  NaN
14    1.5  NaN  NaN
15    1.6  NaN  NaN
16    0.1  NaN  NaN
17    0.2  NaN  NaN
18    0.3  NaN  NaN
19    0.4  NaN  NaN
20    0.5  NaN  NaN
21    0.6  2.0  NaN
22    0.6  NaN  NaN
23    1.1  NaN  NaN
r1zhe5dt

r1zhe5dt2#

所以我尝试了一些东西。首先为我自己创建了一些数据框架。我试着跟着你的txt(对我这个非母语人士来说有点困惑)。我写了一些东西。这不是很一般,但它应该适用于您的情况,有了这个想法,我认为您可以解决问题。

import numpy as np
import pandas as pd
df = np.zeros((8, 3))
f = np.random.randint(8, size=8)

df[:, 0] = f
df[:, 1:] = np.nan
df[1, 1] = 5
df[3, 1:] = 4

df = pd.DataFrame(df)
print(df)

for i in range(len(df)):
    if (df.iloc[i, 1:].notnull()).any()&(df.iloc[i, 1:].isnull()).any():
        print(i)
        df[0][i+1] = df[0][i]

相关问题