我想在数据框中创建带有多个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
答案 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