Python(熊猫)-处理数字数据,但将非数字数据添加回

Python(熊猫)-处理数字数据,但将非数字数据添加回,python,pandas,Python,Pandas,我有一个CSV文件,如下所示: Build,Avg,Min,Max BuildA,56.190,39.123,60.1039 BuildX,57.11,40.102,60.200 BuildZER,55.1134,35.129404123,60.20121 我想得到每列的平均值、最小值、最大值,并将这些统计数据作为一个新行。我排除非数字列(build列),然后运行统计信息。我通过以下方式实现这一目标: df = pd.read_csv('fakedata.csv') columns = []

我有一个CSV文件,如下所示:

Build,Avg,Min,Max
BuildA,56.190,39.123,60.1039
BuildX,57.11,40.102,60.200
BuildZER,55.1134,35.129404123,60.20121
我想得到每列的平均值、最小值、最大值,并将这些统计数据作为一个新行。我排除非数字列(build列),然后运行统计信息。我通过以下方式实现这一目标:

df = pd.read_csv('fakedata.csv')
columns = []
builds = []

for column in df.columns:
    if(df[column].dtype == 'float64'):
        columns.append(column)
    else:
        builds.append(column)

save = df[builds]
df = df[columns]

print(df)

df.loc['Min']= df.min()
df.loc['Average']= df.mean()
df.loc['Max']= df.max()
df.insert(0,'builds', save)
with open('fakedata.csv', 'w') as f:
    df.to_csv(f)
如果我当时将此数据写入CSV,它将如下所示:

,Avg,Min,Max
0,56.19,39.123,60.1039
1,57.11,40.102,60.2
2,55.1134,35.129404123,60.20121
Min,55.1134,35.129404123,60.1039
Average,55.8817,37.3709520615,60.1522525
Max,57.11,40.102,60.20121
这与我想要的很接近,但我希望构建列再次成为第1列,并且构建名称位于最小值、平均值、最大值之上。基本上如下所示:

Builds,Avg,Min,Max
BuildA,56.19,39.123,60.1039
BuildX,57.11,40.102,60.2
BuildZER,55.1134,35.129404123,60.20121
Min,55.1134,35.129404123,60.1039
Average,55.8817,37.3709520615,60.1522525
Max,57.11,40.102,60.20121
我试图通过以下方式实现这一目标:

df = pd.read_csv('fakedata.csv')
columns = []
builds = []

for column in df.columns:
    if(df[column].dtype == 'float64'):
        columns.append(column)
    else:
        builds.append(column)

save = df[builds]
df = df[columns]

print(df)

df.loc['Min']= df.min()
df.loc['Average']= df.mean()
df.loc['Max']= df.max()
df.insert(0,'builds', save)
with open('fakedata.csv', 'w') as f:
    df.to_csv(f)
但这给了我一个CSV:

,builds,Avg,Min,Max
0,Build1,56.19,39.123,60.1039
1,Build2,57.11,40.102,60.2
2,Build3,55.1134,35.129404123,60.20121
Min,,55.1134,35.129404123,60.1039
Average,,55.8817,37.3709520615,60.1522525
Max,,57.11,40.102,60.20121
如何解决此问题?

IIUC:

df_out = pd.concat([df.set_index('Build'),df.set_index('Build').agg(['max','min','mean'])]).rename(index={'max':'Max','min':'Min','mean':'Average'}).reset_index()
输出:

      index      Avg        Min       Max
0    BuildA  56.1900  39.123000  60.10390
1    BuildX  57.1100  40.102000  60.20000
2  BuildZER  55.1134  35.129404  60.20121
3       Max  57.1100  40.102000  60.20121
4       Min  55.1134  35.129404  60.10390
5   Average  56.1378  38.118135  60.16837

尝试df.to_csv(f,index=False)这非常接近,但它会产生一个csv,其中存在构建名称,但现在不存在最小值、平均值和最大值。我认为解决这个问题的最简单方法是在save数据框中添加“Min”、“Average”和“Max”。我找不到一个简单的方法来实现这一点,但是这将是期望的结果,但是添加这一行会导致我在“Build”上出现一个关键错误。我相信这是因为为了确保我只处理数字数据,我使用df=df[columns],其中columns等于:for column in df.columns:if(df[column].dtype=='float64'):columns.append(column)reference为了更好地格式化,有一个将“根据数据类型返回包含/排除列的数据帧子集”我意识到你的答案实际上只是我所做的每件事的一行替代品。你的答案是有效的,但是如果你有额外的时间,如果你能解释代码在做什么,我将不胜感激。我对最小值、最大值、平均值的计算位置以及concat的工作方式感到困惑。好的,我有原始的数据帧df,我设置了索引以将内置内容移动到索引中。接下来,我使用df.agg执行多个聚合返回一个数据帧,其中包含索引中聚合的名称,然后我使用concat将这两个数据帧一个接一个地组合起来。接下来,我重命名索引标签以获得所需的结果,并重置索引以将该索引移回列中。