Python Pandas-基于另一列的条件值创建新列

Python Pandas-基于另一列的条件值创建新列,python,pandas,if-statement,Python,Pandas,If Statement,我想根据列df['col2']上一行的值创建一个新列df['index']。除了,如果在df['col2']列的行中不是“x”(在本例中是字符串-日期),我希望df['index']中的集100。因此,如果df['col2']不是一个“x”,那么我期望一个列“索引”,它每次都以100的值开始 我期望: 您可以在以下位置使用: df['indexed'] = (df['col1'] * df['col1'].shift(1)).where(df['col2']=='x', 100) df 输出:

我想根据列
df['col2']
上一行的值创建一个新列
df['index']
。除了,如果在
df['col2']
列的行中不是
“x”
(在本例中是字符串-日期),我希望
df['index']
中的集
100
。因此,如果
df['col2']
不是一个
“x”
,那么我期望一个列
“索引”
,它每次都以
100
的值开始

我期望:


您可以在以下位置使用

df['indexed'] = (df['col1'] * df['col1'].shift(1)).where(df['col2']=='x', 100)
df
输出:


   col1        col2   indexed
0  1.02           x       NaN
1  1.12           x    1.1424
2  0.90           x    1.0080
3  0.93  2021-60-30  100.0000
4  1.01           x    0.9393
5  1.02           x    1.0302
6  1.12           x    1.1424
7  0.90           x    1.0080
8  0.93           x    0.8370
9  1.01           x    0.9393
   col1        col2     indexed
0  1.02           x  100.000000
1  1.12           x  112.000000
2  0.90           x  100.800000
3  0.93  2021-60-30  100.000000
4  1.01           x  101.000000
5  1.02           x  103.020000
6  1.12           x  115.382400
7  0.90           x  103.844160
8  0.93           x   96.575069
9  1.01           x   97.540819
如果要计算从
col2
中的每个非
x
值开始的累积乘积,请更新:

g = df.groupby(df['col2'].ne('x').cumsum())['col1']
df['indexed'] = g.cumprod() / g.transform('first') * 100
输出:


   col1        col2   indexed
0  1.02           x       NaN
1  1.12           x    1.1424
2  0.90           x    1.0080
3  0.93  2021-60-30  100.0000
4  1.01           x    0.9393
5  1.02           x    1.0302
6  1.12           x    1.1424
7  0.90           x    1.0080
8  0.93           x    0.8370
9  1.01           x    0.9393
   col1        col2     indexed
0  1.02           x  100.000000
1  1.12           x  112.000000
2  0.90           x  100.800000
3  0.93  2021-60-30  100.000000
4  1.01           x  101.000000
5  1.02           x  103.020000
6  1.12           x  115.382400
7  0.90           x  103.844160
8  0.93           x   96.575069
9  1.01           x   97.540819

您是否尝试过apply方法并仅使用自己的函数:

def my_funct(row)

    if row['col2'] == 'x':
       row['indexed']= row['col1'] * row['col1'].shift(1)
    else:
       row['indexed']= 100
然后:

df= df.apply(my_funct, axis=1)

请显示预期输出,谢谢。根据你的解决方案,我发现我犯了一个合乎逻辑的错误。这里:df['index']=df['col1']*df['index'].shift(1)。sorry@Alex请看更新,希望我得到了正确的你想要实现我不理解你的解决方案背后的逻辑。你能告诉我,如果我想设置“col1”的“行值”而不是100,我必须如何更改代码@Alex逻辑是,我们以
col2
中的非
x
值开始分组,然后计算
col1
的累积乘积,并重新缩放以使组中的第一个值为100。如果希望第一个值是
col1
,只需使用
df['index']=g.cumprod()
而不是
df['index']=g.cumprod()/g.transform('first')*100