我有以下数据框和两个数组fillrows和salescodes。Fillrows是我通过提取满足条件的行来生成的数组。为了能够识别产生销售的人,我需要用SalesCode填充另外一列。在fillrows中,我有每个SalesCode的起始行,对应于数组salescodes中的代码。
df = pd.DataFrame([['', 120], ['', 300], ['', 160],['', 220], ['', 400], ['', 560],['', 860],['',900]], columns=['SalesCode', 'Sales'])
fillrows=[0,3,5]
salescodes =['XA','AC','BC']
SalesCode Sales
0 120
1 300
2 160
3 220
4 400
5 560
6 860
7 900
需要这个输出
Output
SalesCode Sales
0 XA 120
1 XA 300
2 XA 160
3 AC 220
4 AC 400
5 BC 560
6 BC 860
7 BC 900
您可以join
和ffill
精心制作的系列:
s = pd.Series(salescodes, index=fillrows[:-1], name='SalesCode')
df2 = df.drop('SalesCode', axis=1).join(s).ffill()
NB。如果SalesCode"为空,则不需要drop
部分。df
中不存在列输出:
>>> df2
Sales SalesCode
0 120 XA
1 300 XA
2 160 XA
3 220 AC
4 400 AC
5 560 BC
6 860 BC
7 900 BC
您可以简单地遍历fillrows
数组并为salescode添加值。注意:我将最后一个索引更改为Len(df),因为salescode中没有第四个值可以从idx 7开始;请随意玩。
import pandas as pd
from itertools import repeat
df = pd.DataFrame([['', 120], ['', 300], ['', 160],['', 220], ['', 400], ['', 560],['', 860],['',900]], columns=['SalesCode', 'Sales'])
fillrows=[0,3,5, len(df)]
salescodes =['XA','AC','BC']
SalesCodes = []
for idx, _ in enumerate(fillrows[:-1]):
SalesCodes.extend(repeat(salescodes[idx], fillrows[idx+1] - fillrows[idx]))
df = df.assign(SalesCode=SalesCodes)
> df
SalesCode Sales
0 XA 120
1 XA 300
2 XA 160
3 AC 220
4 AC 400
5 BC 560
6 BC 860
7 BC 900