重新格式化 Excel 数据框

问题描述 投票:0回答:3

我设法让我的 python 脚本可以使用 Playwright 从网站上抓取数据。 网站数据的格式目前我们无法使用。这是初始提取的示例:

姓名 第一组 第二组 第三组 第四组 第5组
乔布莱克 A U
乔蓝 A A
乔格林 U A
乔红 A U

上表中的A表示用户是组的管理员。我需要将上面的数据放入一个表中,该表中的组位于第一行和第二行(如果他们是该组的管理员并列出了他们的名字)。所以基本上我需要做到这一点:

团体 管理员
第一组 乔蓝,乔红
第二组 乔红
第三组 乔蓝
第四组 乔蓝
第5组 乔格林

我正在尝试使用 Pandas,但完全不知道如何正确设置格式。只需要一些建议或对我可以解决的类似问题的参考?

python pandas
3个回答
1
投票

你可以用

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

0
投票

如果你拆开它,那么你会得到一个带有 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)

0
投票

你是否需要对空字符串/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
© www.soinside.com 2019 - 2024. All rights reserved.