数据框中列和行之间的条件语句
Conditional statement between columns and rows in dataframe
我想创建一个列,它根据同一行中的值之间的 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
中的给定值是否大于 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
中相同值 sum
的第二行,并检查它是否大于 A。 df
和 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
在这种情况下,代码将 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)
也许尝试分多个步骤创建 f。
如果我没理解错的话,你的伪算法应该是这样的:
- 要在 b 中查找的输入值
- 'e' 中的值是否大于 A?
- 如果为真,f 中的值 = 1
- 如果为假,则确定要查找的值是否在 b 中有重复项。获取他们的索引。
- 在您要查找的值最后一次出现的行的 f 列中,对重复项的值求和。
- 总和是否大于A?
- 如果为真,f 中的值 = 1
- 如果为假,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)
希望对您有所帮助!
我想创建一个列,它根据同一行中的值之间的 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
中的给定值是否大于 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
中相同值 sum
的第二行,并检查它是否大于 A。 df
和 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
在这种情况下,代码将 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)
也许尝试分多个步骤创建 f。 如果我没理解错的话,你的伪算法应该是这样的:
- 要在 b 中查找的输入值
- 'e' 中的值是否大于 A?
- 如果为真,f 中的值 = 1
- 如果为假,则确定要查找的值是否在 b 中有重复项。获取他们的索引。
- 在您要查找的值最后一次出现的行的 f 列中,对重复项的值求和。
- 总和是否大于A?
- 如果为真,f 中的值 = 1
- 如果为假,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)
希望对您有所帮助!