我的部分数据框如下所示:
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个):
在df1
col2
中找到非空的第一个值。
根据df1
的{{1}}列col1
和df2
列col1
中值的相等性,插入{{1}列中的值} df1
col2
的{{1}}列。 df2
col2
中的值也将是df1
必须填充col2
的时间间隔。
以下是我的代码,但它只添加一次值:
df2
结果如下:
col2
但他一定是这样:
df1
我将不胜感激任何建议!
答案 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
完成小组:
step
(df2.col2
等于项目)start
)和最后一个索引(stop
)index_to_fill
)step
组。索引。最后连接集合。