将列表值的列转换为带有计数的标题

2024-06-26 00:22:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图重塑下面的数据集df,以将values列表显示为列标题,并将它们显示为值的频率(所需的输出显示在底部)。TBH对于如何前进我有点困惑;我应该创建一个具有适当行和列的数据帧,然后尝试通过lambda函数进行填充吗

keys = ["panda1", "panda2", "panda3"]

values = [["eats", "shoots"], ["shoots", "leaves"], ["eats", "leaves"]]

df = pd.DataFrame({"keys": keys, "values": values})    
df

     keys            values
0  panda1    [eats, shoots]
1  panda2  [shoots, leaves]
2  panda3    [eats, leaves]

有人对前进的最佳方式有任何指导吗?不必编写示例代码,只需编写下一步需要做什么的逻辑

期望输出:

     keys            eats         shoots        leaves    total
0  panda1              1            1             0         2
1  panda2              0            1             1         2
2  panda3              1            0             1         2

Tags: 数据标题df列表keys频率leavesvalues
3条回答

还有一种方法:

df.join(df['values'].str.join(',')
        .str.get_dummies(sep=',')
        .assign(total = lambda x: x.sum(axis=1)))

尝试^{}+^{}加上页边+^{}以去除底部页边:

new_df = df.explode('values')
new_df = (
    pd.crosstab(new_df['keys'], new_df['values'],
                margins=True, margins_name='Total')
        .iloc[:-1]
        .rename_axis(columns=None)
        .reset_index()
)

new_df

     keys  eats  leaves  shoots  Total
0  panda1     1       0       1      2
1  panda2     0       1       1      2
2  panda3     1       1       0      2

您可以使用get_dummiesexplode获取值计数,然后使用sum创建总数

(
    pd.get_dummies(df.explode('values'), columns=['values'], prefix='', prefix_sep='')
    .groupby('keys').sum()
    .pipe(lambda x: x.assign(total= x.sum(axis=1)))
    .reset_index()
)


    keys    eats    leaves  shoots  total
0   panda1  1       0       1       2
1   panda2  0       1       1       2
2   panda3  1       1       0       2

相关问题 更多 >