合并pandas数据帧中的某些行

时间:2017-08-06 10:57:22

标签: python python-2.7 pandas dataframe

我有这个数据帧,包含73行:

Date    Col1    Col2   Col3
1975   float   float  float
1976   float   float  float
1976   float   float  float
1977   float   float  float
1978   float   float  float
....
....

有些年份出现两次,因为这一年的价值是两次。我想要做的是合并年份相同的行,获取特定两行的每列的平均值。事实是我仍然熟悉大熊猫,我并不真正理解loc和iloc选择器的用法。这是我尝试过的,但我确信这是完全错误的,非pythonic:

for i in range(72):
    if df.Date[i]==df.Date[i+1]:
        df.Very_satisfied[i]= (df.Very_satisfied[i]+df.Very_satisfied[i+1])/2
        df.Fairly_satisfied[i]= (df.Fairly_satisfied[i]+df.Fairly_satisfied[i+1])/2
        df.NV_satisfied[i]= (df.NV_satisfied[i]+ df.NV_satisfied[i+1])/2
        df.Not_satisfied[i]= (df.Not_satisfied[i]+ df.Not_satisfied[i+1])/2
        df.DK[i]= (df.DK[i]+ df.DK[i+1])/2
        a=i+1
        str(a)
        df.drop(a)

其中“非常满意”,“相当满意”的ecc。是列。我的代码中的要点是:如果两年相同,则计算每个值的平均值,将其替换为第一行并删除第二行。 我真的需要更聪明,更优雅的东西。

1 个答案:

答案 0 :(得分:1)

您可以使用groupby()然后使用mean()。这是一个例子:

import pandas as pd
import numpy as np

df = pd.DataFrame({'date': list(range(25)) * 2, 'col1': np.random.random(50) * 100, 'col2': np.random.random(50)})
df.groupby('date').mean()

这将获取相同日期的所有行,计算每列中所有行的平均值。

我的样本输出:

df.groupby('date').mean().head()
           col1      col2
date
0     42.881950  0.436073
1     32.114299  0.309742
2     96.819446  0.809071
3     30.606661  0.284257
4     40.690211  0.624972

对于此输入:

df[df['date'] < 5]

    date       col1      col2
0      0  67.268605  0.393560
1      1  55.864578  0.508636
2      2  97.735942  0.861162
3      3  58.014599  0.117055
4      4   7.429489  0.637101
25     0  18.495296  0.478585
26     1   8.364020  0.110848
27     2  95.902950  0.756980
28     3   3.198724  0.451460
29     4  73.950932  0.612843