Python dataframe中列和行之间的条件语句
我想创建一个to列,它基于if语句在同一行中的值之间创建一个值,如果需要,在上面的行中创建一个值。 我有一个常数a和df 我想创建另一个名为f的列,它将告诉我对于b中的给定值,e中的值是否大于A。如果正确,则值为1 上述df的示例:Python dataframe中列和行之间的条件语句,python,pandas,dataframe,if-statement,conditional,Python,Pandas,Dataframe,If Statement,Conditional,我想创建一个to列,它基于if语句在同一行中的值之间创建一个值,如果需要,在上面的行中创建一个值。 我有一个常数a和df 我想创建另一个名为f的列,它将告诉我对于b中的给定值,e中的值是否大于A。如果正确,则值为1 上述df的示例: FID_1 b c d e f 75907 nan 33021647.00 27014.12 27014.12 1.00 1 758
FID_1 b c d e f
75907 nan 33021647.00 27014.12 27014.12 1.00 1
75858 159510.00 32888862.00 16532.64 28797.05 0.57 1
75859 159510.00 32888862.00 12264.41 28797.05 0.43 0
75795 nan 32869718.00 24218.16 24218.16 1.00 1
75518 nan 32574894.00 13304.45 13304.45 1.00 1
更棘手的是,如果我将A的值更改为0.6。在这种情况下,我希望看到b中的每个数字,如果b中的值的第一行e中的值大于a,如果不是,我希望看到e中的值的相同值的第二行和,并检查它是否大于a。a=0.6的df如下所示:
FID_1 b c d e f
75907 nan 33021647.00 27014.12 27014.12 1.00 1
75858 159510.00 32888862.00 16532.64 28797.05 0.57 0
75859 159510.00 32888862.00 12264.41 28797.05 0.43 1
75795 nan 32869718.00 24218.16 24218.16 1.00 1
75518 nan 32574894.00 13304.45 13304.45 1.00 1
在这种情况下,代码将df第三行中的0.57和0.43相加
如果不是这样的话,代码将转到第三、第四,。。。b中相同值的行-如果它甚至存在
这是创建e列的代码
我尝试对f列进行类似的操作,但我不知道如何在同一代码中输入if语句
这是我的解决方案的开始:
def STAcondition (row):
if row['e'] > A :
return 0
if row['e'] < A :
return 1
return 'Other'
df['f'] = df.apply (lambda row: STAcondition (row),axis=1)
也许可以尝试在多个步骤中创建f。 如果我理解正确,您的伪算法应该如下所示:
FID_1 b c d e f
75907 nan 33021647.00 27014.12 27014.12 1.00 1
75858 159510.00 32888862.00 16532.64 28797.05 0.57 0
75859 159510.00 32888862.00 12264.41 28797.05 0.43 1
75795 nan 32869718.00 24218.16 24218.16 1.00 1
75518 nan 32574894.00 13304.45 13304.45 1.00 1
在b中查找的输入值
“e”中的值是否大于A?
如果为true,则f中的值=1
如果为false,则确定要查找的值在b中是否重复。获取他们的索引。
在您要查找的值的最后一次出现的行中,在f列中,对重复项的值求和。
总和大于A吗?
如果为true,则f中的值=1
如果为false,则f中的值为0
以下是我起草的一些文件:
import pandas as pd
import numpy.random as npr
import numpy as np
# Dummy data
dfInit = {
'FID_1':npr.randint(0,10,10),
'b':npr.randint(0,10,10),
'c':npr.randint(0,10,10),
'd':npr.randint(0,10,10),
'e':npr.randint(0,10,10)
}
dfIndex = np.arange(0,10)
df = pd.DataFrame(data=dfInit, index=dfIndex)
# Algo
df['f'] = np.zeros(10)
A = 6
def letsMakeAnF(value):
# check if value is in b
if value in df['b'].unique():
occurrenceMatch = df.loc[df['b'] == value,:]
else:
print('value not in b series')
return
if occurrenceMatch['e'].iloc[0] > A:
df['f'].ix[occurrenceMatch.index[0]] == 1
else:
if np.sum(occurrenceMatch['b']) > A:
df['f'].ix[occurrenceMatch.index[-1]] = 1
#Generate random 'wanted' values
values = [npr.randint(0, 10) for x in range(10)]
#Iterate over the values and modify the DF. Note that in this case
#df is a global variable
for value in values:
letsMakeAnF(value)
希望有帮助 第一部分的答案是df['f']=df['e']>a.astypeint。第二个更复杂,你需要一个循环。你的逻辑不太合理-为什么第二行不应该是1,因为它和前一行的总和大于A?是的。对于b中的值32888862,f中的第一行为0,第二行为1,因为e中的值之和大于A,是的。棘手的我试图通过.shift和np的组合找到解决方案。where commands我得到了loc-indexer的一个错误:单个位置索引器超出范围。我喜欢它的逻辑,只需要先修复错误,但在本例中,您用“value”修复了“b”中的值,这在整个df中是不同的。我想我知道为什么会出现错误。“b”中是否存在“值”?如果没有,则occurrenceMatch是一个空的DF,这会破坏算法,可能在执行其余操作之前应该捕获这种情况。如果需要迭代不同的“值”,则始终可以将代码重构为一个以“值”为参数的函数,并在需要的值上循环!我只是想让anwser尽可能简单,这样我们就可以直截了当了:请给出一个例子,如何将代码重构成一个以“value”为参数的函数,并在这个例子中循环一列中的值?
import pandas as pd
import numpy.random as npr
import numpy as np
# Dummy data
dfInit = {
'FID_1':npr.randint(0,10,10),
'b':npr.randint(0,10,10),
'c':npr.randint(0,10,10),
'd':npr.randint(0,10,10),
'e':npr.randint(0,10,10)
}
dfIndex = np.arange(0,10)
df = pd.DataFrame(data=dfInit, index=dfIndex)
# Algo
df['f'] = np.zeros(10)
A = 6
def letsMakeAnF(value):
# check if value is in b
if value in df['b'].unique():
occurrenceMatch = df.loc[df['b'] == value,:]
else:
print('value not in b series')
return
if occurrenceMatch['e'].iloc[0] > A:
df['f'].ix[occurrenceMatch.index[0]] == 1
else:
if np.sum(occurrenceMatch['b']) > A:
df['f'].ix[occurrenceMatch.index[-1]] = 1
#Generate random 'wanted' values
values = [npr.randint(0, 10) for x in range(10)]
#Iterate over the values and modify the DF. Note that in this case
#df is a global variable
for value in values:
letsMakeAnF(value)