我想过滤一个数据框,计算各行的平均值,然后用这些平均值创建一个新的数据框。在下面的示例中,我获得了“蓝色”和“红色”类型的平均值,按月计算平均值,然后创建一个数据框,其中蓝色和红色为列,每月平均值为行。
我的问题是:有没有办法做到这一点?因此,例如,如果我有一个列表(在这种情况下为['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
答案 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