首页 > 解决方案 > 按行重新格式化数据框

问题描述

我需要你的帮助来处理一个复杂的(对我而言)关于 pandas 的 groupby。我有以下数据框。

 ID 目标 特征标识 特征值
6f281111 0 右-acx_02 5.433747
6f281111 0 右分 0.097000
a1111628 1 left_ss_01 -0.650741
a1111628 1 右-wcs 3.359375
6f282222 0 left_l_tf 0.000000
...... ...... ...... ……

对于每个“id”,我有大约 400 行代表不同的特征。我想重新格式化数据框以具有类似的内容:

指数 目标 右-acx_02 右分 left_ss_01 右-wcs left_l_tf ...
6f281111 0 5.433747 0.097000 不适用 不适用 不适用 ...
a1111628 1 不适用 不适用 -0.650741 3.359375 不适用 ...
6f282222 0 不适用 不适用 不适用 不适用 0.000000 ...
... ... …… …… …… …… ... ...

这就是我现在所做的,它有效,但我知道它远非最佳。

unique_uuids = list(raw_df["evaluation_uuid"].unique())
values = np.insert(raw_df["feature_id"].unique(), 0, ["user_id"])
dict_feature = dict.fromkeys(np.insert(raw_df["feature_id"].unique(), 0, ["user_id"]))
pre_df = {uuid:dict_feature for uuid in unique_uuids}
df_transformed = pd.DataFrame.from_dict(pre_df, orient="index")

for index, row in tqdm(self.raw_df.iterrows()):
    df_transformed.loc[row['evaluation_uuid'], row["feature_id"]] = row["feature_value"]
    df_transformed.loc[row['evaluation_uuid'], "user_id"] = row["user_id"]
    
df_transformed = df_transformed.fillna(0)

我想这个问题有一个矢量化的解决方案,如果您需要任何详细信息,请告诉我。

先感谢您。

标签: pythonpandasdataframe

解决方案


由于从评论中听起来@Chris 规范解决方案对您不起作用,可能是您有重复的行(基于('id', 'target', 'feature_id'))。

为了找到它们,请尝试:

dupes = df.loc[df.duplicated(subset=['id', 'target', 'feature_id'])]

如果不是dupes.empty,那么您知道您的数据有问题。

您可以决定如何处理该问题(引发错误?删除每个重复项中除第一行之外的所有内容?取平均值?)。这是一个示例,我们只取feature_value重复项的平均值:

df2 = df.groupby(['id', 'target', 'feature_id']).mean().squeeze().unstack('feature_id')

即使存在欺骗,这也应该有效。


推荐阅读