datafram中行与列之间的条件语句

2024-04-20 10:48:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个to列,它基于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中的值是否大于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,如果不是,我想查看e中的值的相同值的第二行sum,并检查它是否大于a。具有A=0.6df如下所示:

          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列的代码

df['e'] = df.apply(lambda row: row.c / row.d, axis=1)

我对f列尝试了类似的方法,但是我不知道如何在相同的代码中输入if statement。你知道吗

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

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)


Tags: tolambda代码dfreturnif常数情况
1条回答
网友
1楼 · 发布于 2024-04-20 10:48:54

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

  • 在b中查找的输入值
  • “e”中的值是否大于A?
    • 如果为真,则f中的值为1
    • 如果为false,则确定要查找的值在b中是否有重复项。获取它们的索引。
      • 在您要查找的值的最后一次出现的行中,在f列中,对重复项的值求和。你知道吗
      • 总和大于A吗?
        • 如果为真,则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)

希望有帮助!你知道吗

相关问题 更多 >