保持每个数据帧组中的一个(不变)行
问题描述:
我有一个熊猫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)
...
但我怀疑肯定有一个不太圆的方式。
答
你可以使用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
答
我想你需要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
答
我想你有很多选择这里,或多或少优雅。首先,你关心'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
为什么不干脆不'groupby'之前,首先选择那些列?例如'df [df.columns.difference(['X','Y'])]。groupby(['A','B','C'])' – EdChum
这是一个好主意,但我也需要合并在分组列上计算的数据帧会有所不同。所以它可能会起作用,但我需要小心索引。 – alexis
对我来说,对于我来说,只是看起来多余,然后放下你不感兴趣的列,最好不要在操作之前选择它们。 – EdChum