我正在处理一个数据帧df
:
0 1 2 3 4 5 6 7
2 418 -5 -81 526 NaN NaN NaN NaN
5 415 -5 -116 487 -5 116 462 -24
7 413 -5 -81 323 NaN NaN NaN NaN
我写了一个代码来检查column 4
是否为空。如果为 true,则4
、5
、6
、7
0
、1
、2
3
的值填充,并添加 4 个具有相同值的列。
rows = df.index
for i in rows1:
if np.isnan(df.loc[i,4]):
df.loc[i,4] = df.loc[i,0]
df.loc[i,5] = df.loc[i,1]
df.loc[i,6] = df.loc[i,2]
df.loc[i,7] = df.loc[i,3]
df.loc[i,8] = df.loc[i,0]
df.loc[i,9] = df.loc[i,1]
df.loc[i,10] = df.loc[i,2]
df.loc[i,11] = df.loc[i,3]
df
给定和期望的输出:
0 1 2 3 4 5 6 7 8 9 10 11
2 418 -5 -81 526 418 -5 -81 526 418 -5 -81 526
5 415 -5 -116 487 -5 116 462 -24 NaN NaN NaN NaN
7 413 -5 -81 323 413 -5 -81 323 413 -5 -81 323
我的问题:如何优化我的代码以避免重复作业。 我试过了
df.loc[i,4:7]=df.loc[i,0:3]
df.loc[i,8:11]=df.loc[i,0:3]
但它没有给出预期的结果。
这是矢量化逻辑的一种方法:
# create null test Boolean series & define replacement array
null_test = df[4].isnull()
arr = df.loc[null_test, [0, 1, 2, 3]].values
# update 4, 5, 6, 7
df.loc[null_test, [4, 5, 6, 7]] = arr
# add additional columns
df = df.join(pd.DataFrame(columns=[8, 9, 10, 11]))
# update 8, 9, 10, 11
df.loc[null_test, [8, 9, 10, 11]] = arr
print(df)
0 1 2 3 4 5 6 7 8 9 10 11
2 418 -5 -81 526 418.0 -5.0 -81.0 526.0 418 -5 -81 526
5 415 -5 -116 487 -5.0 116.0 462.0 -24.0 NaN NaN NaN NaN
7 413 -5 -81 323 413.0 -5.0 -81.0 323.0 413 -5 -81 323