将列转换为行,将以前列的值\计数显示为列中的列值

2024-04-19 12:38:56 发布

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

假设我有这个数据集。 每个变量可以假定值介于1和5之间。这些变量表示相似的对象,所以我想在所有数据集中比较它们

import pandas as pd
df = pd.DataFrame({'dataset': ["ds1", "ds2", "ds3", "ds4", "ds5"], 
                   'var1': [1, 4, 5, 3, 1], 
                   'var2': [2, 1, 1, 2, 5],
                   'var3': [2, 1, 1, 2, 5]})
df

我想使用.T转换df,并将数据汇总如下:

行:每行代表一个变量(var1到var3) 第1-5列:表示这些变量的值,每个单元格显示该值在所有数据集中出现的总数(var1.value\u计数)

示例:行1表示var1。第1列显示“1”在所有数据集中出现两次,第2列显示2出现0次

预期结果

         1 2 3 4 5
var1     2 0 1 1 1
var2     2 2 0 0 1
var3     2 2 0 0 1 

也许我需要使用交叉表或透视表?谢谢


Tags: 数据对象importdataframepandasdfasdataset
2条回答

^{}^{}^{}一起使用:

df1 = (df.melt('dataset')
         .pivot_table(index='variable',
                      columns='value',
                      aggfunc='size',
                      fill_value=0)
         .rename_axis(index=None, columns=None))
print (df1)
      1  2  3  4  5
var1  2  0  1  1  1
var2  2  2  0  0  1
var3  2  2  0  0  1

或者对于没有使用转置的第一个value_counts的所有列,将缺少的值替换为0,最后将所有值转换为整数:

df = df.set_index('dataset').apply(pd.value_counts).T.fillna(0).astype(int)
print (df)
      1  2  3  4  5
var1  2  0  1  1  1
var2  2  2  0  0  1
var3  2  2  0  0  1
    

是的,crosstabmelt之后可以正常工作(或者在@jezrael的解决方案中,pivot table):

tab = df.melt("dataset")

pd.crosstab(tab.variable, tab.value).rename_axis(index=None, columns=None)


        1   2   3   4   5
var1    2   0   1   1   1
var2    2   2   0   0   1
var3    2   2   0   0   1

是的,您可以使用normalize参数,并通过行(索引)或列选择是否需要它:

pd.crosstab(tab.variable, tab.value, normalize='all').rename_axis(index=None, columns=None)

相关问题 更多 >