如何合并多个if条件以创建新列并从上一行中添加或减去

时间:2019-08-21 22:51:33

标签: python pandas dataframe

我想在数据框中创建带有多个if条件的新列,并根据条件在上一行中添加值或减去值。

我尝试使用lambda函数,但是我很确定语法是错误的。所以我真的不知道要解决我的问题。与df['b']一样,这只是一个测试lambda函数的伪变量,而不是df['a']

也许是一个等式:a_i = 1t* 40 + a0直到620,在达到T = 620之后下降一个a _i = a_i-1 -1t+40的比率。

import pandas as pd


df = pd.DataFrame({'t' : [0, 8,32, 56, 96, 128],
               'T' : [460, 500, 620, 500, 300, 460],
              })
df1 = pd.DataFrame({'t' : [0, 8,32, 56, 96, 128],
               'T' : [460, 500, 620, 500, 300, 460],
               'a' : [10000, 10320, 11280, 10320, 8720, 10000]})

print (df)

df.loc[0,'a']=10000
df['a']= df['t']*5+ df.loc[0,'a']

df.loc[0,'b']=100
df['b'] = df['T'].apply(lambda x: df['t']*5+ df.loc[0,'b'] if x <= 500 
df['t']*5+ df.loc[0,'b'] if x <= 620 
-df['t']*5+ df.loc[0,'b'] if x <= 300 )


#df.loc[0,'i']=50
#df['i'] = [5+ df.loc[0,'i'] for x in range(df.shape[0])]

print(df)

print(df1)

我想创建类似这样的东西:

     t    T      a
0    0  460  10000
1    8  500  10320
2   32  620  11280
3   56  500  10320
4   96  300   8720
5  128  460  10000

1 个答案:

答案 0 :(得分:1)

如果要使用apply引用多列,则必须为整个行编写函数并将其应用于整个数据帧。例如:

import pandas as pd

df = pd.DataFrame({ 
    't' : [0, 8,32, 56, 96, 128],
    'T' : [460, 500, 620, 500, 300, 460],
})

def a(row):
    a_0 = 10000
    return a_0 + row['t'] + row['T']

df['a'] = df.apply(a, axis=1)
print(df)

哪些印刷品:

     t    T      a
0    0  460  10460
1    8  500  10508
2   32  620  10652
3   56  500  10556
4   96  300  10396
5  128  460  10588

这不是解决问题的方法,但是您可以看到row['t']row['T']中的值都是可以访问的。

但是,在您的情况下,我认为您最好只使用for循环,直到到达620,然后对其余行使用另一个for循环:

import pandas as pd

df = pd.DataFrame({ 
    't' : [0, 8,32, 56, 96, 128],
    'T' : [460, 500, 620, 500, 300, 460],
})

a_0 = 10000
for i in range(len(df)):
    df.loc[i, 'a'] = df['t'][i] * 40 + a_0
    if df['T'][i] == 620:
        break

for i in range(i + 1, len(df)):
    df.loc[i, 'a'] = df['a'][i - 1] - (df['t'][i] - df['t'][i - 1]) * 40
    if df['T'][i] == 300:
        break

for i in range(i + 1, len(df)):
    df.loc[i, 'a'] = df['a'][i - 1] + (df['t'][i] - df['t'][i - 1]) * 40
    if df['T'][i] == 460:
        break

print(df)

哪些印刷品:

     t    T        a
0    0  460  10000.0
1    8  500  10320.0
2   32  620  11280.0
3   56  500  10320.0
4   96  300   8720.0
5  128  460  10000.0