python:根据过滤后的数据框的平均值创建一个新的数据框

时间:2018-11-21 00:03:56

标签: python pandas

我想过滤一个数据框,计算各行的平均值,然后用这些平均值创建一个新的数据框。在下面的示例中,我获得了“蓝色”和“红色”类型的平均值,按月计算平均值,然后创建一个数据框,其中蓝色和红色为列,每月平均值为行。

我的问题是:有没有办法做到这一点?因此,例如,如果我有一个列表(在这种情况下为['blue','red']),我可以遍历该列表以获取平均值,创建蓝色和红色数据框,然后将它们连接起来吗? / p>

import pandas as pd
#CREATE GENERIC DATAFRAME
df = {'account': ['Alpha', 'Beta', 'Gamma', 'Epsilon'],
      'Type': ['red','blue','red','blue'],
         'Jan': [150, 200, 50, 40],
         'Feb': [200, 210, 90, 30],
         'Mar': [140, 215, 95, 60],
         'Apr': [150, 190, 75, 20]}
df = pd.DataFrame.from_dict(df)

#filter for blue types only
df_blue = df[df['Type'] == 'blue']

#get averages for blue types
blue_series = df_blue.mean()

#create a dataframe for blue types
blue_df = blue_series.to_frame()
blue_df = blue_df.rename(columns = {0:'blue'})

#repeat above for red types
df_red = df[df['Type'] == 'red']
red_series = df_red.mean()
red_df = red_series.to_frame()
red_df = red_df.rename(columns = {0:'red'})

#CONCATENATE BLUE AND RED DATAFRAMES
final_df = pd.concat([blue_df, red_df],axis=1)

所需结果:

    blue    red
Apr  105.0  112.5
Feb  120.0  145.0
Jan  120.0  100.0
Mar  137.5  117.5

1 个答案:

答案 0 :(得分:2)

您可以尝试以下方法:

means_df = pd.DataFrame()
for color in ['red', 'blue']:
    dff = df[df['Type']==color]
    means = dff.mean(0).to_frame().rename(columns={0:color})
    means_df = pd.concat([means_df, means], 1)
print(means_df)

或更简单:

df.groupby('Type').mean().T

均生成此数据框:

Type    blue    red
Jan 120.0   100.0
Feb 120.0   145.0
Mar 137.5   117.5
Apr 105.0   112.5