数据框中列和行之间的条件语句

时间:2019-02-14 08:46:09

标签: python pandas dataframe if-statement conditional

我想创建到列,该列基于if语句在同一行中的值之间(如果需要,在上述各行中)创建一个值。 我有一个常数A和df

A = 0.5
          FID_1          b          c        d            e
75907       nan 33021647.00   27014.12 27014.12        1.00
75858 159510.00 32888862.00   16532.64 28797.05        0.57
75859 159510.00 32888862.00   12264.41 28797.05        0.43
75795       nan 32869718.00   24218.16 24218.16        1.00
75518       nan 32574894.00   13304.45 13304.45        1.00

我想创建另一个名为f的列,它将告诉我e中的值是否大于A(对于b中的给定值)。如果正确,则该值为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并且如果不是,我想在sum中查找与值e相同的第二行,并检查它是否大于A。{{1} }}如下:

df

在这种情况下,代码将df第三行中的0.57和0.43相加。

如果不是这种情况,则代码将查找A=0.6中相同值的第三,第四,...行-甚至存在。

这是用于创建 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列尝试了类似的方法,但是我不知道如何在同一代码中输入df['e'] = df.apply(lambda row: row.c / row.d, axis=1)

这是我的解决方案的开始:

f

1 个答案:

答案 0 :(得分:1)

也许尝试分多个步骤创建f。 如果我理解正确,您的伪算法应如下所示:

  • 要在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)

希望有帮助!