![](/img/trans.png)
[英]fill the column with the sum of the values from the other column in the specified interval in pandas
[英]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个):
在df1
col2
中找到不为空的第一个值。
而基于列的值相等col1
的df2
和列col1
的df1
,从插入列中的值col2
的df2
成列col2
的df1
。 df2
col2
的df2
也将是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
。
完成组:
step
( df2.col2
等于项目) start
),最后一个索引( stop
) index_to_fill
) step
填充组。 最后连接集合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.