如何使用列中的值组合创建数据框
How to create a dataframe with combinations of values within a column
好的伙计们,这个很难。
此问题的主题基于欺诈数据、规则和付款 - 我认为了解一些背景知识更容易理解我正在尝试做什么。
我有一个数据框,其中包含帐户 ID、金额、日期、欺诈等,以及一个名为规则的列。每个 accountid 可以触发许多独特的规则。
accountid amount date rule fraud
123 5 20191101 rule_1 fraud
123 10 20191102 rule_2 fraud
456 50 20191101 rule_1 nonfraud
456 50 20191101 rule_2 nonfraud
456 50 20191101 rule_3 nonfraud
456 50 20191101 rule_4 nonfraud
我的目标是创建一个函数,循环遍历 2 条规则(以后可能是 3 条)的每个组合,并有几个其他的列来计算 accountids、欺诈和非欺诈 accountids 的数量、欺诈率等。结果看起来像这样:
rule_combo count_acct count_fraud count_nonfraud fraudrate
rule_1,rule_2 5 3 2 .6
rule_2,rule_3 20 10 10 .5
rule_2,rule_4 50 10 40 .1
rule_1,rule_3 10 3 7 .3
我有一个看起来像这样的函数,可以执行我想要的操作,但它使用列 (headers):
def combo_cols(df,agg,cols,n,minrate=0)
combos = list(itertools.combinations(cols,3))
num_cols = ['col1','col2','col3']
res = []
for combo in combos:
fr = fraudrate(df,agg,combo) #using another function
accounts = df.groupby(combo).apply(lambda df:list(df.accountid.unique()))
accounts.name = 'accounts'
accounts = accounts.to_frame()
fr = accounts.join(fr)
fr = fr.reset_index()
fr['naccts'] = fr.apply(lamda df: len(set(df.accounts)),axis=1)
fr.columns = num_cols + ['accounts','naccts','fraud','nonfraud','fraudrate','fpr']
fr = fr.assign(groupcols = ', '.join(combo))
fr = fr.loc[fr.fraudrate.gt(minrate)]
res.append(fr)
return pd.concat(res).sort_values(by='fraudrate',ascending=False)
我还没有想好如何编写一个函数来为规则执行此操作。感谢对此的任何帮助。
我不确定我是否在回答你的问题,所以请给我反馈,如果需要我会更新。
我的第一个赌注是 OneHotEncode 您拥有的那些功能。这是一个例子:
df = pd.get_dummies(df, columns=['rule', 'fraud'])
结果是:
accountid amount rule_rule_1 rule_rule_2 rule_rule_3 rule_rule_4 fraud_fraud fraud_nonfraud
0 123 5 1 0 0 0 1 0
1 123 10 0 1 0 0 1 0
2 456 50 1 0 0 0 0 1
3 456 50 0 1 0 0 0 1
4 456 50 0 0 1 0 0 1
5 456 50 0 0 0 1 0 1
然后你可以使用 itertools 来做这样的事情:
import itertools
for elt in itertools.combinations(list(df.columns[df.columns.str.startswith('rule')]), 2):
tmp = df.groupby(list(elt))
# Apply your aggregation functions here
希望对您有所帮助!
好的伙计们,这个很难。
此问题的主题基于欺诈数据、规则和付款 - 我认为了解一些背景知识更容易理解我正在尝试做什么。
我有一个数据框,其中包含帐户 ID、金额、日期、欺诈等,以及一个名为规则的列。每个 accountid 可以触发许多独特的规则。
accountid amount date rule fraud
123 5 20191101 rule_1 fraud
123 10 20191102 rule_2 fraud
456 50 20191101 rule_1 nonfraud
456 50 20191101 rule_2 nonfraud
456 50 20191101 rule_3 nonfraud
456 50 20191101 rule_4 nonfraud
我的目标是创建一个函数,循环遍历 2 条规则(以后可能是 3 条)的每个组合,并有几个其他的列来计算 accountids、欺诈和非欺诈 accountids 的数量、欺诈率等。结果看起来像这样:
rule_combo count_acct count_fraud count_nonfraud fraudrate
rule_1,rule_2 5 3 2 .6
rule_2,rule_3 20 10 10 .5
rule_2,rule_4 50 10 40 .1
rule_1,rule_3 10 3 7 .3
我有一个看起来像这样的函数,可以执行我想要的操作,但它使用列 (headers):
def combo_cols(df,agg,cols,n,minrate=0)
combos = list(itertools.combinations(cols,3))
num_cols = ['col1','col2','col3']
res = []
for combo in combos:
fr = fraudrate(df,agg,combo) #using another function
accounts = df.groupby(combo).apply(lambda df:list(df.accountid.unique()))
accounts.name = 'accounts'
accounts = accounts.to_frame()
fr = accounts.join(fr)
fr = fr.reset_index()
fr['naccts'] = fr.apply(lamda df: len(set(df.accounts)),axis=1)
fr.columns = num_cols + ['accounts','naccts','fraud','nonfraud','fraudrate','fpr']
fr = fr.assign(groupcols = ', '.join(combo))
fr = fr.loc[fr.fraudrate.gt(minrate)]
res.append(fr)
return pd.concat(res).sort_values(by='fraudrate',ascending=False)
我还没有想好如何编写一个函数来为规则执行此操作。感谢对此的任何帮助。
我不确定我是否在回答你的问题,所以请给我反馈,如果需要我会更新。
我的第一个赌注是 OneHotEncode 您拥有的那些功能。这是一个例子:
df = pd.get_dummies(df, columns=['rule', 'fraud'])
结果是:
accountid amount rule_rule_1 rule_rule_2 rule_rule_3 rule_rule_4 fraud_fraud fraud_nonfraud
0 123 5 1 0 0 0 1 0
1 123 10 0 1 0 0 1 0
2 456 50 1 0 0 0 0 1
3 456 50 0 1 0 0 0 1
4 456 50 0 0 1 0 0 1
5 456 50 0 0 0 1 0 1
然后你可以使用 itertools 来做这样的事情:
import itertools
for elt in itertools.combinations(list(df.columns[df.columns.str.startswith('rule')]), 2):
tmp = df.groupby(list(elt))
# Apply your aggregation functions here
希望对您有所帮助!