繁体   English   中英

用熊猫的索引间隔填充列中的单元格

[英]Fill cells in the column with the index interval in pandas

我的部分数据框如下所示:

         df1                    df2
 scale  col1    col2        col1    col2
   1    item1   NaN         item1     3
   2    item1   NaN         item2     2
   3    item1   NaN         ...
   4    item1   NaN         
   5    item1   NaN         
   6    item1     6         
   7    item1   NaN         
   8    item1   NaN         
   9    item1   NaN         
  10    item1   NaN         
  11    item1   NaN         
  12    item1   NaN         
  13    item1   NaN         
  14    item1   NaN         
  15    item1   NaN         
   1    item2   NaN         
   2    item2   NaN         
   3    item2   NaN         
   4    item2   NaN         
   5    item2   NaN         
   6    item2   NaN         
   7    item2   NaN         
   8    item2     8         
   9    item2   NaN         
  10    item2   NaN         
  11    item2   NaN         
  12    item2   NaN         
  13    item2   NaN         
  14    item2   NaN         
  15    item2   NaN         
  ...

我需要对df1 col1列中的每个唯一值执行以下操作(在原始数据帧中大约有100个):

  1. df1 col2中找到不为空的第一个值。

  2. 而基于列的值相等col1df2和列col1df1 ,从插入列中的值col2df2成列col2df1 df2 col2df2也将是df1 col2必须填充的时间间隔。

以下是我的代码,但仅添加一次值:

df_test = df1[df1['col2'].notnull()] # find non-empty values
df_test = df_test.set_index(['col1'])
df2 = df2.set_index(['col1'])
df_test['scale'] = df_test['scale'] + df2['col2']
df_test['col2'] = df2['col2']
df_test = df_test.reset_index()
df1 = df1.set_index(['col1', 'scale']).fillna(df_test.set_index(['col1', 'scale'])).reset_index()

结果看起来像这样:

 scale  col1    col2
   1    item1   NaN
   2    item1   NaN
   3    item1   NaN
   4    item1   NaN
   5    item1   NaN
   6    item1     6
   7    item1   NaN
   8    item1   NaN
   9    item1     3
  10    item1   NaN
  11    item1   NaN
  12    item1   NaN
  13    item1   NaN
  14    item1   NaN
  15    item1   NaN
   1    item2   NaN
   2    item2   NaN
   3    item2   NaN
   4    item2   NaN
   5    item2   NaN
   6    item2   NaN
   7    item2   NaN
   8    item2     8
   9    item2   NaN
  10    item2     2
  11    item2   NaN
  12    item2   NaN
  13    item2   NaN
  14    item2   NaN
  15    item2   NaN
  ...

但是他必须是这样的:

 scale  col1    col2
   1    item1   NaN
   2    item1   NaN
   3    item1   NaN
   4    item1   NaN
   5    item1   NaN
   6    item1     6
   7    item1   NaN
   8    item1   NaN
   9    item1     3
  10    item1   NaN
  11    item1   NaN
  12    item1     3
  13    item1   NaN
  14    item1   NaN
  15    item1     3
   1    item2   NaN
   2    item2   NaN
   3    item2   NaN
   4    item2   NaN
   5    item2   NaN
   6    item2   NaN
   7    item2   NaN
   8    item2     8
   9    item2   NaN
  10    item2     2 
  11    item2   NaN
  12    item2     2
  13    item2   NaN
  14    item2     2
  15    item2   NaN
...

我将不胜感激任何建议!

遍历项目组:

我使用的DF:

df_item1 = pd.DataFrame({'col1':['item1']*15,'col2':[np.nan]*15})
df_item1.loc[5,'col2'] = 6
df_item2 = pd.DataFrame({'col1':['item2']*15,'col2':[np.nan]*15})
df_item2.loc[7,'col2'] = 8
df1 = pd.concat([df_item1,df_item2])
# and
df2 = pd.DataFrame({'col1':['item1','item2'],'col2':[3,2]})

编码

dfs = []
for item, _df in df1.groupby('col1'):

    step = df2[df2.col1==item].col2.values[0]
    start = _df[~np.isnan(_df.col2)].index[0]+step
    stop = _df.index[-1]+1
    index_to_fill = np.arange(start=start,step=step,stop=stop)

    _df.loc[index_to_fill,'col2'] = step
    dfs.append(_df)
df1 = pd.concat(dfs)

结果:

     col1  col2
0   item1   NaN
1   item1   NaN
2   item1   NaN
3   item1   NaN
4   item1   NaN
5   item1   6.0
6   item1   NaN
7   item1   NaN
8   item1   3.0
9   item1   NaN
10  item1   NaN
11  item1   3.0
12  item1   NaN
13  item1   NaN
14  item1   3.0
0   item2   NaN
1   item2   NaN
2   item2   NaN
3   item2   NaN
4   item2   NaN
5   item2   NaN
6   item2   NaN
7   item2   8.0
8   item2   NaN
9   item2   2.0
10  item2   NaN
11  item2   2.0
12  item2   NaN
13  item2   2.0
14  item2   NaN

说明
我创建了一个DF( dfs )集合,其中包含按项目分组的完整df1
完成组:

  • 找到要应用的stepdf2.col2等于项目)
  • 查找该组的第一个非nan数据( start ),最后一个索引( stop
  • 生成需要填充的行的“掩码”( index_to_fill
  • 根据索引的“掩码”,用step填充组。

最后连接集合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM