我有一只大熊猫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)
...
但我怀疑必须采取不那么圆润的方式。
答案 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