pandas 重新设置Excel数据框格式

ejk8hzay  于 2023-03-11  发布在  其他
关注(0)|答案(3)|浏览(133)

我设法让我的python脚本使用Playwright从一个网站上抓取数据。网站数据的格式目前对我们来说不可用。下面是最初提取的一个例子:
| 姓名|第1组|第二组|第三组|第四组|第五组|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 乔·布莱克|A类|||美国||
| 乔·布鲁||A类|A类|||
| 乔·绿色|美国||||A类|
| 乔·瑞德||A类||美国||
上表中的A表示用户是组的管理员。我需要将上面的数据放入一个表中,如果他们是组的管理员,则在第1行和第2行列出他们的名称。因此,基本上我需要将其设置为:
| 组别|管理员|
| - ------|- ------|
| 第1组|乔·布鲁乔·瑞德|
| 第二组|乔·瑞德|
| 第三组|乔·布鲁|
| 第四组|乔·布鲁|
| 第五组|乔·绿色|
我试图使用Pandas,但完全失去了如何获得正确的格式。只是需要一些建议或参考类似的问题,我可以工作了?

watbbzwu

watbbzwu1#

您可以使用melt进行整形,然后使用dropnagroupby.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
vsmadaxz

vsmadaxz2#

如果你将其拆分,那么你会得到一个带有MultiIndex的Series。然后你可以使用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)
xxslljrj

xxslljrj3#

如果您需要对空字符串/NA保持健壮性:

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,
    'U': False,
    '': 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

相关问题