以下是示例数据帧:
>>> 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
值。条件是当x
或y
不是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
你能试试吗:
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
所以我尝试了一些东西。首先为我自己创建了一些数据帧。我试着关注你的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]