Python dataframe中列和行之间的条件语句

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

我想创建一个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
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)