Python 一列查找列的范围并提供相应的值-值

Python 一列查找列的范围并提供相应的值-值,python,pandas,numpy,Python,Pandas,Numpy,我正在尝试创建一个名为['FirstYearSales']的新列,它获取['CohortYear']列中的值,并查找相应的列标签,并在行中提供相应的值。有人知道如何做到这一点吗 data = [[2017, 150, 200, 300], [2018, 0, 750, 650], [2019, 0, 0, 50]] data = pd.DataFrame(data, columns = ['CohortYear', '2017', '2018', '2019']) CohortYe

我正在尝试创建一个名为['FirstYearSales']的新列,它获取['CohortYear']列中的值,并查找相应的列标签,并在行中提供相应的值。有人知道如何做到这一点吗

data = [[2017, 150, 200, 300], [2018, 0, 750, 650], [2019, 0, 0, 50]] 
data = pd.DataFrame(data, columns = ['CohortYear', '2017', '2018', '2019']) 

    CohortYear  2017    2018    2019
0   2017        150     200     300
1   2018        0       750     650
2   2019        0       0       50
预期结果如下所示:

    CohortYear  FirstYearSales  2017    2018    2019
0   2017        150             150     200     300
1   2018        750             0       750     650
2   2019        50              0       0       50
我的一次失败尝试:

data['FirstYearSales'] = data.loc[list(data.columns.values)] == ['CohortYear']
从以下位置获取位置后,尝试在“CohortYear”列后插入列:

查找速度似乎更快,避免在axis=1上应用,因为它可能很慢:针对30K行运行示例:

m = pd.concat([data]*10000,ignore_index=True)
%%timeit
m.lookup(m.index,m['CohortYear'].map(str))
#23.7 ms ± 805 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
m
%%timeit
m.apply(lambda x: x[str(x.CohortYear)], axis=1)
#1.98 s ± 70.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
从以下位置获取位置后,尝试在“CohortYear”列后插入列:

查找速度似乎更快,避免在axis=1上应用,因为它可能很慢:针对30K行运行示例:

m = pd.concat([data]*10000,ignore_index=True)
%%timeit
m.lookup(m.index,m['CohortYear'].map(str))
#23.7 ms ± 805 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
m
%%timeit
m.apply(lambda x: x[str(x.CohortYear)], axis=1)
#1.98 s ± 70.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
使用:

数据['FirstYearSales']=data.applylambda x:x[strx.CohortYear],axis=1 2017年2018年2019年第一年销售额 0 2017 150 200 300 150 1 2018 0 750 650 750 2 2019 0 0 50 50 使用:

数据['FirstYearSales']=data.applylambda x:x[strx.CohortYear],axis=1 2017年2018年2019年第一年销售额 0 2017 150 200 300 150 1 2018 0 750 650 750 2 2019 0 0 50 50
@真的!我使用了错误的输入数据,因此覆盖了一个已经存在的列。我用我得到的实际结果编辑:@anky真的!我使用了错误的输入数据,因此覆盖了一个已经存在的列。我用我得到的实际结果进行了编辑:
m = pd.concat([data]*10000,ignore_index=True)
%%timeit
m.lookup(m.index,m['CohortYear'].map(str))
#23.7 ms ± 805 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
m
%%timeit
m.apply(lambda x: x[str(x.CohortYear)], axis=1)
#1.98 s ± 70.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)