我设法让我的 python 脚本可以使用 Playwright 从网站上抓取数据。 网站数据的格式目前我们无法使用。这是初始提取的示例:
姓名 | 第一组 | 第二组 | 第三组 | 第四组 | 第5组 |
---|---|---|---|---|---|
乔布莱克 | A | U | |||
乔蓝 | A | A | |||
乔格林 | U | A | |||
乔红 | A | U |
上表中的A表示用户是组的管理员。我需要将上面的数据放入一个表中,该表中的组位于第一行和第二行(如果他们是该组的管理员并列出了他们的名字)。所以基本上我需要做到这一点:
团体 | 管理员 |
---|---|
第一组 | 乔蓝,乔红 |
第二组 | 乔红 |
第三组 | 乔蓝 |
第四组 | 乔蓝 |
第5组 | 乔格林 |
我正在尝试使用 Pandas,但完全不知道如何正确设置格式。只需要一些建议或对我可以解决的类似问题的参考?
melt
,然后dropna
和groupby.agg
重塑:
out = (df.melt('Name', var_name='Group').dropna(subset='value')
.groupby('Group')['Name'].agg(', '.join).reset_index(name='Admins')
)
stack
的变体:
(df.set_index('Name').rename_axis(index='Admins', columns='Group')
.stack().reset_index()
.groupby('Group', as_index=False)['Admins'].agg(', '.join)
)
输出:
Group Admins
0 Group 1 Joe Black
1 Group 2 Joe Blue, Joe Red
2 Group 3 Joe Blue
3 Group 5 Joe Green
如果你拆开它,那么你会得到一个带有 MultiIndex 的系列。然后,您可以使用 groupby 并加入对应于“A”值的名称:
def getAdmins(x):
sel = x[x == "A"]
return ",".join(sel.index.get_level_values(1)) if sel.any() else np.nan
df_new = df.unstack().groupby(level=0).agg(getAdmins)
你是否需要对空字符串/NAs 保持健壮:
df = pd.DataFrame({
'Name': ['Joe Red', 'Joe Blue', 'Joe Green'],
'Group 1': ['A', pd.NA, ''],
'Group 2': ['', 'A', 'A'],
'Group 3': ['', np.nan, 'A'],
})
df_t = df.set_index('Name').T.replace({
'A': True,
'': False,
pd.NA: False,
np.nan: False,
})
df_t.apply(
lambda x: df_t.columns[x].str.cat(sep=','), axis=1
).reset_index(name='Admins').rename(columns={'index': 'Groups'})
输出:
Groups Admins
0 Group 1 Joe Red
1 Group 2 Joe Blue,Joe Green
2 Group 3 Joe Green