熊猫保留原始DataFrame dtypes

时间:2020-05-16 23:15:42

标签: python pandas dataframe

我有一个与此类似的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

您可以看到idpose不再是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排序(分数越低越好),第一个姿势不一定具有最佳分数。

1 个答案:

答案 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

此外,我们还有headdrop_duplicates

 df.groupby('id').head(1)

 df.drop_duplicates('id')