如果数据的类别为B,并且下一行也包含类别B,则应将第一个单元格的值复制到下一个单元格。该公式仅适用于类别B。
此处“值”列显示原始值,“期望”列显示期望的值。我尝试使用shift命令,但在保留值时却没有用。
我的数据库很大,只是示例而已。
''' 代码尝试过'''
df['expected'] = df.groupby('category')['value'].transform('first')
上面的代码将在类别B的所有位置复制值20。
将每个连续的B
分成groupID s
和groupby s
与Category
s = df.Category.ne('B').cumsum()
df['New_val'] = df.groupby(['Category',s])['Value'].transform('first')
Out[23]:
Time Category Value New_val
0 9:00 A 50 50
1 9:01 A 50 50
2 9:02 B 20 20
3 9:03 B 30 20
4 9:04 C 40 40
5 9:05 B 25 25
6 9:06 B 30 25
7 9:07 B 35 25
8 9:08 D 50 50
,
这是一个numpy方法:
df = pd.DataFrame({"Category":list("AABBCBBBD"),"Data":[50,50,20,30,40,25,35,50]})
# create result column
df["Modified"] = df["Data"]
# get underlying numpy array
data = df["Modified"].to_numpy()
# get mask of B positions
B = df["Category"].to_numpy()=="B"
# find on and off indices
dB,= np.where(np.diff(B,prepend=False,append=False))
# repeat the first element of each block len(block) times and fill them
# in according to the mask
data[B] = data[dB[::2]].repeat(dB[1::2]-dB[::2])
# admire
df
# Category Data Modified
# 0 A 50 50
# 1 A 50 50
# 2 B 20 20
# 3 B 30 20
# 4 C 40 40
# 5 B 25 25
# 6 B 30 25
# 7 B 35 25
# 8 D 50 50