2017-10-17 66 views
0
我dataframes的

部分看起來是這樣的:填充細胞與大熊貓索引間隔柱

  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   
    ... 

我需要做的每一個獨特的價值以下在df1col1列(原數據幀有約100):

  1. 查找的df1col2的第一個值不爲空。

  2. 並基於價值在df2col1柱和柱的df1col1平等,從df2col2列值插入的df1col2列。 col2df2中的值也將是col2df1必須填寫的時間間隔。

下面是我的代碼,但它增加了一個值只有一次:

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 
... 

我將不勝感激任何建議!

回答

1

循環以上項目組:

在DFS我使用:

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
要完成組:

  • 找到step申請(df2.col2等於項)
  • 查找組(start)的第一不楠數據,最後指數(stop
  • 生成您需要填寫的行的「掩碼」(index_to_fill
  • 根據索引的「掩碼」向組填充step

最後連接集合。