使用pd.DataFrame.loc进行分配

时间:2018-05-14 15:45:24

标签: python pandas dataframe

我正在处理数据框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是否为空。如果填充4567,其值为012,{{1并添加4个具有相同值的列。

3

给定和期望的输出:

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

但它没有给出所需的结果。

1 个答案:

答案 0 :(得分:1)

这是向量化逻辑的一种方法:

# 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