2017-02-28 70 views
0

我有一个熊猫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) 
... 

但我怀疑肯定有一个不太圆的方式。

+1

为什么不干脆不'groupby'之前,首先选择那些列?例如'df [df.columns.difference(['X','Y'])]。groupby(['A','B','C'])' – EdChum

+0

这是一个好主意,但我也需要合并在分组列上计算的数据帧会有所不同。所以它可能会起作用,但我需要小心索引。 – alexis

+0

对我来说,对于我来说,只是看起来多余,然后放下你不感兴趣的列,最好不要在操作之前选择它们。 – EdChum

回答

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

我想你需要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 
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 
相关问题