【发布时间】:2020-07-06 13:24:18
【问题描述】:
我有一个看起来像这样的数据框
pd.DataFrame({'a':['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'],
'b':['N', 'Y', 'Y', 'N', 'Y', 'N', 'Y', 'N', 'N', 'Y'],
'c':[4, 5, 9, 8, 1, 3, 7, 2, 6, 10]})
a b c
0 A N 4
1 B Y 5
2 C Y 9
3 D N 8
4 E Y 1
5 F N 3
6 G Y 7
7 H N 2
8 I N 6
9 J Y 10
在 10 行中,我想根据以下条件选择 5 行:
“c”列是我的排名列。
- 选择排名最低的 2 行(已选择第 4 行和第 7 行)
- 选择列 'b' = 'Y' AND rank
- 如果使用上述标准选择的行数少于 5 行,则剩余的未平仓头寸应按排名顺序(最低)填充,其中 'b' = 'Y' 的行和排名
- 如果通过前 3 个条件的行少于 5 行,则按排名顺序(最低)填充剩余位置,其中 'b' = 'N'
我已经尝试过这个(包括规则 1 和 2),但正在努力从那里继续下去
df['selected'] = ''
df.loc[(df.c <= 2), 'selected'] = 'rule_1'
df.loc[((df.c <= 5) & (df.b == 'Y')), 'selected'] = 'rule_2'
我的结果数据框应该是这样的
a b c selected
0 A N 4 False
1 B Y 5 rule_2
2 C Y 9 False
3 D N 8 rule_4
4 E Y 1 rule_1
5 F N 3 False
6 G Y 7 rule_3
7 H N 2 rule_1
8 I N 6 False
9 J Y 10 False
基于下面 Vinod Karantothu 提供的解决方案,我选择了以下似乎可行的解决方案:
def solution(df):
def sol(df, b='Y'):
result_df_rule1 = df.sort_values('c')[:2]
result_df_rule1['action'] = 'rule_1'
result_df_rule2 = df.sort_values('c')[2:].loc[df['b'] == b].loc[df['c'] <= 5]
result_df_rule2['action'] = 'rule_2'
result = pd.concat([result_df_rule1, result_df_rule2]).head(5)
if len(result) < 5:
remaining_rows = pd.concat([df, result, result]).drop_duplicates(subset='a', keep=False)
result_df_rule3 = remaining_rows.loc[df['b'] == b].loc[df['c'] <= 7]
result_df_rule3['action'] = 'rule_3'
result = pd.concat([result, result_df_rule3]).head(5)
return result, pd.concat([remaining_rows, result, result]).drop_duplicates(subset='a', keep=False)
result, remaining_data = sol(df)
if len(result) < 5:
result1, remaining_data = sol(remaining_data, 'N')
result1['action'] = 'rule_4'
result = pd.concat([result, result1]).head(5).drop_duplicates(subset='a', keep=False).merge(df, how='outer', on='a')
return result
if __name__ == '__main__':
df = pd.DataFrame({'a': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'],
'b': ['N', 'Y', 'Y', 'N', 'Y', 'N', 'Y', 'N', 'N', 'Y'],
'c': [4, 5, 9, 8, 1, 3, 7, 2, 6, 10]})
result = solution(df)
print(result)
【问题讨论】:
-
这听起来工作量很大,你能告诉我们你的尝试和失败,所以我们有一些起始位置吗?
-
如果规则 1 或 2 有多个匹配项,输出中的行顺序应该是什么?在原始 df 中按排名还是按顺序?
-
每一行或基本上'a'列中的每个字母只能选择一次。因此,如果在规则 1 中选择它,则规则 2 会忽略它
-
好的,我的意思是在规则范围内。假设您有 2 行匹配规则 2 而不是规则 1。它们应按什么顺序包含?基于数据框中的排名或第一个外观?
-
啊好的。基于等级(但不应该真的很重要,因为 df 的构造方式是规则 1 和 2 总共不应该选择超过 5 个)。请查看我对原始帖子的编辑。这应该涵盖规则 1 和 2。我正在努力解决规则 3 和 4。