我有一个与此类似的DataFrame:
id pose score
437209 842134 1 -6.5
437210 842134 2 -6.3
437211 842134 3 -6.3
437212 842134 4 -6.1
437213 842134 5 -6.1
437214 842134 6 -5.5
437215 842134 7 -5.4
437216 842134 8 -5.2
437217 842134 9 -5.2
437218 842134 10 -5.1
19435 842135 1 -7.0
19436 842135 2 -6.8
我想从每个id
的前1个得分中创建另一个DataFrame。但是,当我按它们的id
对值进行分组时,它们的dtypes会发生变化,所以我的df2
看起来像这样:
df2 = pd.DataFrame([args.iloc[0] for _,args in df.groupby('id')])
print(df2.head(2))
id pose score
437209 842134.0 1.0 -6.5
19435 842135.0 1.0 -7.0
获取dtype:
for i, args in df[:20].groupby('id'):
print(args.iloc[0])
id 842134.0
pose 1.0
score -6.5
Name: 437209, dtype: float64
id 842135.0
pose 1.0
score -7.0
Name: 19435, dtype: float64
您可以看到id
和pose
不再是int
,这将损害其余的代码,因为我将使用这些值进行索引。这是我尝试过的几件事:
df2 = pd.DataFrame([args.iloc[0] for _,args in df.groupby('id')], dtype=df.dtypes)
TypeError: dtype 'id int64
pose int64
vina_score float64
dtype: object' not understood
df2 = pd.DataFrame([args.iloc[0] for _,args in df.groupby('id')], dtype=df.dtypes.to_dict())
ValueError: entry not a 2- or 3- tuple
df2 = pd.DataFrame([args.iloc[0] for _,args in df.groupby('id')], dtype=df.dtypes.tolist())
TypeError: data type not understood
任何帮助将不胜感激。编辑:对于每个score
,df按id
排序(分数越低越好),第一个姿势不一定具有最佳分数。
答案 0 :(得分:0)
也就是说,当您将Series传递给dataframe构造函数时,我们应该做concat
pd.concat([args.iloc[0] for _,args in df.groupby('id')])
id pose score
437209 842134 1 -6.5
19435 842135 1 -7.0
此外,我们还有head
和drop_duplicates
df.groupby('id').head(1)
df.drop_duplicates('id')