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