首页 > 解决方案 > 基于第二个数据帧中的标签对一个数据帧进行分组

问题描述

我有一个 SWOT 表的数据框(实际上是 105k dframes)表示(应该是一个包含字符串的 4x4 网格)。问题在于,并非整个集合 (105k) 中的所有帧都具有相同的形状,并且 SWOT 元素的位置也各不相同。我的方法是创建每个帧的副本,然后在原始帧中查找特定字符串并在副本中添加标签+一些前向填充。

现在我有了原始帧和副本(相同大小、相同索引和相同列名),其中原始帧具有我想要分组的字符串和一个基本上是掩码的副本(不是布尔值 - 而是标签掩码)。

在循环整个集合时,我将原始帧与基于索引的副本合并,并获得一个合并帧,其中包含两个帧的列,并带有 _x 和 _y 后缀。如何将 _y 列中与 _x 列中具有相同标记的字符串连接到新数据帧?

+---+-------+-------------+-------+-------------+-----+-----+
|   | 0_x   | 0_y         | 1_x   | 1_y         | n_x | n_y |
+---+-------+-------------+-------+-------------+-----+-----+
| 0 | tag_1 | some_string | tag_2 | some_string |     |     |
| 1 | tag_1 | some_string | tag_2 | some_string |     |     |
| 2 | tag_2 | some_string | tag_3 | some_string |     |     |
| n | tag_2 | some_string | tag_3 | some_string |     |     |
+---+-------+-------------+-------+-------------+-----+-----+

到目前为止,这是我的代码-基本上它可以满足我对列对(n_x,n_y)的要求,但是如果我在更多列中具有相同的标记(例如在 0_x 和 1_x 中),它就不起作用。我可以对列 a 和 b 进行第二次迭代,并与第一种情况相同,但有没有更有效的方法?

df_tmp(包含标签)和 df_orig(包含字符串)

df_merged = pd.merge(df_tmp, df_orig, left_index=True, right_index=True, validate="1:1")
df_merged = df_merged.applymap(str)
columns_list = df_merged.columns.to_list()
x_columns = [elem for elem in columns_list if elem.endswith("x")]
y_columns = [elem for elem in columns_list if elem.endswith("y")]
df_collect = pd.DataFrame()
for col_x, col_y in zip(x_columns, y_columns):
    df_final = df_merged.groupby([col_x])[col_y].apply(','.join).reset_index()
    df_final = df_final.rename(columns={col_x: 'a', col_y: 'b' })
    df_collect = df_collect.append(df_final, ignore_index=True)

标签: python-3.xpandas

解决方案


推荐阅读