使用pandas

时间:2017-10-17 09:09:43

标签: python 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         
  ...

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

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

  2. 根据df1的{​​{1}}列col1df2col1中值的相等性,插入{{1}列中的值} df1 col2的{​​{1}}列。 df2 col2中的值也将是df1必须填充col2的时间间隔。

  3. 以下是我的代码,但它只添加一次值:

    df2

    结果如下:

    col2

    但他一定是这样:

    df1

    我将不胜感激任何建议!

1 个答案:

答案 0 :(得分:1)

循环群组项目:

我使用的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等于项目)
  • 查找该组的第一个非纳米数据(start)和最后一个索引(stop
  • 生成"掩码"您需要填充的行(index_to_fill
  • 根据"掩码"填写step组。索引。

最后连接集合。