Python 从每个数据帧组中保留一行(不变)

Python 从每个数据帧组中保留一行(不变),python,pandas,Python,Pandas,我有一个pandasDataFrame,我通过三列的组合将其分组a、B、C grouped = df.groupby(["A", "B", "C"]) 对于每组的所有元素,多个附加列D、E、F、G是(保证)相同的,而其他列X、Y在每组中有所不同。(我已经知道哪些列是固定的,哪些不同。) 我想构造一个数据帧,每个组包含一行,并且只包含固定列a、B、C、D、E、F、G的值。最直接的方法是什么?因为有很多相同的值,我更愿意指定要忽略哪些列,而不是相反 我提出了“聚合”方法,从每个组中选择一行,然后在

我有一个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"]
这样做的目的是在每个(当前)组有一行的数据帧中,将不变值与我计算的几个新的摘要值组合在一起

但我想一定有一条不太迂回的路。

我想你需要:

我认为你需要:


我想你有很多选择,或多或少优雅。 首先,你关心“X”和“Y”吗?如果你没有,因为你在最后删除它们,你可以简单地使用


我想你有很多选择,或多或少优雅。 首先,你关心“X”和“Y”吗?如果你没有,因为你在最后删除它们,你可以简单地使用

您可以使用仅选择每个组的第一条记录。比如说这个,

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
您可以使用仅选择每个组的第一条记录。比如说这个,

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

为什么不在
groupby
之前首先选择这些列呢?e、 g.
df[df.columns.difference(['X','Y'])].groupby(['A','B','C'])
这是个好主意,但我还需要与根据不同分组列计算的数据帧合并。所以它可能会起作用,但我需要注意索引。对我来说,分组然后删除你不感兴趣的列似乎是多余的,最好不要在操作之前选择它们。我感兴趣的是从删除的列中计算值;我还需要结果中的不变列。无论如何,
difference()
方法很好了解。另外,您还可以对所有不变列进行分组,并将
作为_index=False
重置_index
传递,但如果您只想删除重复,则已有一种方法可用于此操作,这取决于您最终想要实现什么。为什么不在
groupby
之前首先选择这些列呢?e、 g.
df[df.columns.difference(['X','Y'])].groupby(['A','B','C'])
这是个好主意,但我还需要与根据不同分组列计算的数据帧合并。所以它可能会起作用,但我需要注意索引。对我来说,分组然后删除你不感兴趣的列似乎是多余的,最好不要在操作之前选择它们。我感兴趣的是从删除的列中计算值;我还需要结果中的不变列。无论如何,知道
difference()
方法很好。你还可以做的另一件事是对所有不变列进行分组,并将
作为_index=False
reset_index
传递,但如果你只想删除重复,那么已经有一个现有的方法用于此,这取决于你最终想要实现什么。
A  B
1  1    2
2  1    3
   2    3
3  2    1
Name: C, dtype: int64