可能是一个愚蠢的问题,但我在两者之间感到困惑,在这种情况下,如何有效地应用groupby的逻辑将是值得赞赏的。
我的数据就像
id NAME TYPE SCORE title
123 DDLJ cat1 1-6 5
123 DDLJ cat1 9-10 25
123 DDLJ cat1 N 5
456 Satya cat2 9-10 1
456 Satya cat2 N 3
222 India cat2 1-6 1我需要为一个组(id名称类型)找出一个名为'cat_score‘的列,它的逻辑应该是“该组标题的分数(9-10)-分数的标题(1-6)/该组的标题之和”。
#ex for group 123, DDLJ cat1
cat score = (title at SCORE "9-10" - title at SCORE "1-6") / (Sum of title of that group)
= (25 - 5) / (35)
= 0.58注:有三种类型的评分"9-10","1-6","N“。因此,如果对于任何组,没有找到任何得分类别,则应该将其视为0或可以忽略。
我最后的数据应该看起来像
id NAME TYPE SCORE title Cat_Score
123 DDLJ cat1 1-6 5 0.58
123 DDLJ cat1 9-10 25 0.58
123 DDLJ cat1 N 5 0.58
456 Satya cat2 9-10 1 0.34
456 Satya cat2 N 3 0.34
222 India cat2 1-6 1 -1请建议一下。
我试过用一个小组
s = round((int(df[(df['id']=='123') & (df['NAME'] == 'DDLJ') & (df['TYPE']=='cat1') & (df['SCORE']=='9-10')]['title'].values[0]) - int(df[(df['id']=='123') & (df['NAME'] == 'DDLJ') & (df['TYPE']=='cat1') & (df['SCORE']=='1-6')]['title'].values[0])) / (int(df['title'].sum())),2)
s = 0.58但是对于所有的群体来说,我很困惑如何复制。
发布于 2016-08-07 16:51:03
我认为,如果您首先重塑您的DataFrame,会更容易:
df2 = df.set_index(['id', 'NAME', 'TYPE']).pivot(columns='SCORE').fillna(0)
df2.columns = df.columns.droplevel(0)
df2
Out:
SCORE 1-6 9-10 N
id NAME TYPE
123 DDLJ cat1 5.0 25.0 5.0
222 India cat2 1.0 0.0 0.0
456 Satya cat2 0.0 1.0 3.0现在,您可以更容易地执行这些操作:
(df['9-10'] - df['1-6']) / df.sum(axis=1)
Out:
id NAME TYPE
123 DDLJ cat1 0.571429
222 India cat2 -1.000000
456 Satya cat2 0.250000为了在合并中使用这些内容,我将重置索引:
res = ((df['9-10'] - df['1-6']) / df.sum(axis=1)).reset_index()
res
Out:
id NAME TYPE 0
0 123 DDLJ cat1 0.571429
1 222 India cat2 -1.000000
2 456 Satya cat2 0.250000并最终与原始DataFrame合并:
df.merge(res)
Out:
id NAME TYPE SCORE title 0
0 123 DDLJ cat1 1-6 5 0.571429
1 123 DDLJ cat1 9-10 25 0.571429
2 123 DDLJ cat1 N 5 0.571429
3 456 Satya cat2 9-10 1 0.250000
4 456 Satya cat2 N 3 0.250000
5 222 India cat2 1-6 1 -1.000000发布于 2016-08-07 19:18:53
试着回答您的问题,如何应用groupby:
def getScore(gb):
x = gb[gb['SCORE'] == '9-10']['title'].values.sum()
y = gb[gb['SCORE'] == '1-6']['title'].values.sum()
z = float(gb['title'].sum())
return pd.Series((x-y)/z)
gb = df2.groupby(["NAME"])['SCORE', 'title'].apply(getScore).reset_index()
gbdict = dict(gb.values)
gbdict
{'DDLJ': 0.5714285714285714, 'India': -1.0, 'Satya': 0.25}
df2['cat_score'] = df2['NAME'].map(dict(gb.values))
id NAME TYPE SCORE title cat_score
0 123 DDLJ cat1 1-6 5 0.571429
1 123 DDLJ cat1 9-10 25 0.571429
2 123 DDLJ cat1 N 5 0.571429
3 456 Satya cat2 9-10 1 0.250000
4 456 Satya cat2 N 3 0.250000
5 222 India cat2 1-6 1 -1.000000https://stackoverflow.com/questions/38815865
复制相似问题