python - 按行重新格式化数据框
问题描述
我需要你的帮助来处理一个复杂的(对我而言)关于 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)
我想这个问题有一个矢量化的解决方案,如果您需要任何详细信息,请告诉我。
先感谢您。
解决方案
由于从评论中听起来@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')
即使存在欺骗,这也应该有效。
推荐阅读
- arrays - 在数组中找到重复项并打印它们
- typescript - 如何在 v-model 中为基于类的组件使用 getter 和 setter?
- amazon-web-services - 无法安装 aws-cli
- sql - 比较单行上按行分组
- java - 如何在 NDK 中计算 C 中的输入 int 数组
- node.js - 如何在 expressJS 中使用路由器传输帖子数据?
- javascript - 在 Javascript 中循环处理 SVG 对象
- typescript - 如何键入具有未知长度的有序类型的数组?
- php - 未定义属性:stdClass、HasOne 数据
- sql - MariaDB:如何在 WITH 语句中使用“INSERT ... SELECT”