簡體   English   中英

dataframe groupby 操作

[英]dataframe groupby operations

我需要在具有相同類別的行中進行操作。 假設我有以下 dataframe

  |  Category  |    course  |  2010  |  2011  |  2012  |
------------------------------------------------------------
0 |      A     |    Math    |   981  |   21   |  9817  |
1 |      A     |   English  |   14   |  1610  |  11487 |
2 |      A     |   History  | 22.74  |   15   |  12256 |
3 |      B     |    Math    |   NaN  |   NaN  |  9817  |
4 |      B     |   English  |   NaN  |  1610  |   11   |
5 |      B     |   History  | 22.74  |   NaN  |   25   |

我想得到下面的操作。

  |  Category  |    course  |  2010  |  2011  |  2012  |
------------------------------------------------------------
0 |      A     |    NEW     |   XXX  |   XXX  |   XXX  |
1 |      B     |    NEW     |   XXX  |   XXX  |   XXX  |

其中 NEW 是以下操作的結果:
(數學 + 英語)* 歷史/100 對於年份列中的每個新單元格 (XXX)

Category對 DataFrame 進行分組,並按提供的公式匯總每年的值。 您可以通過預先將course設置為索引來訪問每列的相應值。

def aggregate_courses(row):
    return (row["Math"] + row["English"]) * row["History"] / 100

df.set_index("course").groupby("Category").aggregate(aggregate_courses).reset_index()

Output:

    Category  2010     2011    2012
0   A         226.263  244.65  2611018.24
1   B         NaN      NaN     2457.0

不知何故, course專欄丟失了。 如果你需要它,你可以把它重新放回去。

result["course"] = "NEW"
m=df['course'].isin(['Math','English'])#Mask
g=df[m].groupby('Category').sum()#dataframe with the summation of math and english
h=df[~m].drop('course',1).groupby('Category').apply(lambda x: x/100).fillna(0)#dataframe with history
df3=pd.DataFrame(g.values*h.values, columns=g.columns, index=g.index)#element to element multiplication of dfs

    

             2010    2011        2012
Category                             
A         226.263  244.65  2611018.24
B           0.000    0.00     2457.00

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM