保持每个数据集组中的一个(不变)行

时间:2017-02-28 14:37:39

标签: python pandas

我有一只大熊猫DataFrame,我将其归为三列A, B, C的组合。

grouped = df.groupby(["A", "B", "C"])

对于每个组的所有元素,(保证)其他几列D, E, F, G是相同的,而其他列X, Y在每个组中都有所不同。 (我已经知道哪些列是固定的,哪些列有所不同。)

我想构建一个数据帧,每个组包含一行,并且仅包含不变列A, B, C, D, E, F, G的值。最简单的方法是什么?由于有许多相同的值,我宁愿指定要省略哪些列,而不是相反。

我已经提出了"聚合"从每个组中选择一行,然后在单独的步骤中删除不需要的列:

thinned = grouped.aggregate(lambda x: x.iloc[0])
del thinned["X"], thinned["Y"]

这样做的目的是将不变值与我计算的几个新汇总值组合在一个每个(当前)组有一行的数据框中。

thinned["newAA"] = grouped.apply(some_function)
thinned["newBB"] = grouped.apply(other_function)
...

但我怀疑必须采取不那么圆润的方式。

3 个答案:

答案 0 :(得分:2)

您可以使用GroupBy.first()仅选择每个组的第一条记录。例如,这个

import pandas

df = pandas.DataFrame({
    'A': [1, 1, 2, 2, 3, 3], 
    'B': [1, 1, 1, 2, 2, 2], 
    'C': [2, 2, 3, 3, 1, 1]
})
print(df.groupby(['A', 'B'])['C'].first())

结果

A  B
1  1    2
2  1    3
   2    3
3  2    1
Name: C, dtype: int64

答案 1 :(得分:1)

我认为你需要drop_duplicates

df = pd.DataFrame({'A':[7,4,4],
                   'B':[7,4,4],
                   'C':[7,4,4],
                   'D':[7,4,4],
                   'E':[7,4,4],
                   'F':[7,4,4],
                   'G':[7,4,4],
                   'X':[1,2,8],
                   'Y':[5,7,0]})

print (df)
   A  B  C  D  E  F  G  X  Y
0  7  7  7  7  7  7  7  1  5
1  4  4  4  4  4  4  4  2  7
2  4  4  4  4  4  4  4  8  0

#filter by subset
cols = ["A", "B", "C", "D","E","F", "G"]
df1 = df.drop_duplicates(subset=cols)[cols]
print (df1)
   A  B  C  D  E  F  G
0  7  7  7  7  7  7  7
1  4  4  4  4  4  4  4

#remove unnecessary columns
df2 = df.drop(['X','Y'], axis=1).drop_duplicates()
print (df2)
   A  B  C  D  E  F  G
0  7  7  7  7  7  7  7
1  4  4  4  4  4  4  4

答案 2 :(得分:1)

我猜你在这里有很多选择,或多或少优雅。 首先,你关心'X'和'Y'?如果不这样做,因为您最后删除了它们,只需使用drop_duplicates

即可
new_df = df[['A', 'B', 'C', 'D', 'E', 'F', 'G']].drop_duplicates()
# this will keep only the unique values of the above columns