Python 3.x 如果值以多列形式存在于给定列表中,并统计列数

Python 3.x 如果值以多列形式存在于给定列表中,并统计列数,python-3.x,pandas,Python 3.x,Pandas,我在df以下 B C D E 2 2 4 11 11 0 5 3 12 10 1 11 5 9 7 15 首先,我想从整个df中获得一个唯一的值,如下所示: [0,1,2,3,4,5,7,9,10,11,12,15] 然后我想要最终的输出 value value exists in number of col 0

我在df以下

B      C     D         E
2      2     4         11    
11     0     5         3
12     10    1         11
5      9     7         15 
首先,我想从整个df中获得一个唯一的值,如下所示:

[0,1,2,3,4,5,7,9,10,11,12,15]
然后我想要最终的输出

value  value exists in number of col
0           1
1           1
2           2
3           1
4           1
5           1
7           1
9           1
10          1
11          2
12          1
15          1

这意味着每个值都有多少列可用
我想要输出

使用python,您可以执行以下操作:

#您的输入df作为列表列表
df=[[2,11,12,5],[2,0,10,9],[4,5,1,7],[11,3,11,15]]
#删除每个列表中的重复项
dfU=[列表(集合(l)),用于df中的l]
#对每个列表进行排序(此方法不需要)
对于dfU中的l:
l、 排序()
#请求的唯一列表
flatList=[子列表中项目的df子列表中的项目]
唯一列表=列表(集合(平面列表))
打印(唯一列表)
#输出为列表列表
输出=[]
对于唯一列表中的num:
cnt=0
对于范围内的idx(len(dfU)):
如果dfU[idx].count(num)>0:
cnt+=1
output.append([num,cnt])
打印(输出)
旁注,
count
函数在计算上非常昂贵,因此最好沿所有已排序的列进行线性扫描。

用于重塑,按两列删除重复项,并按数据帧进行计数:

df1 = (df.melt(value_name='value')
        .drop_duplicates()
        .groupby('value')
        .size()
        .reset_index(name='count'))
print (df1)
    value  count
0       0      1
1       1      1
2       2      2
3       3      1
4       4      1
5       5      2
6       7      1
7       9      1
8      10      1
9      11      2
10     12      1
11     15      1
详细信息

print (df.melt(value_name='value'))
   variable  value
0         B      2
1         B     11
2         B     12
3         B      5
4         C      2
5         C      0
6         C     10
7         C      9
8         D      4
9         D      5
10        D      1
11        D      7
12        E     11
13        E      3
14        E     11
15        E     15
删除索引
14
的一个
11

print (df.melt(value_name='value').drop_duplicates())
   variable  value
0         B      2
1         B     11
2         B     12
3         B      5
4         C      2
5         C      0
6         C     10
7         C      9
8         D      4
9         D      5
10        D      1
11        D      7
12        E     11
13        E      3
15        E     15
如果想要纯python解决方案:

from collections import Counter

L = sorted(Counter([y for x in df.T.values for y in set(x)]).items())

df1 = pd.DataFrame(L, columns=['value','count'])
print (df1)
    value  count
0       0      1
1       1      1
2       2      2
3       3      1
4       4      1
5       5      2
6       7      1
7       9      1
8      10      1
9      11      2
10     12      1
11     15      1

第一个唯一值步骤的原因是什么?在我看来,您可以简单地将原始
df
排序为一个数组。然后相同值的倍数彼此相邻。在数组上迭代一次,只需计算值的重复频率即可创建最终输出。谢谢,你能用代码解释一下吗?但我也想要唯一的值列表谢谢你的支持你的代码给出了输出值出现的次数但我想要有多少列可用该值为ex.11值呈现“B”和“E”列表示答案是2列Y…得到了我想要的…谢谢你的支持支持我感谢您的帮助,但答案与我的输出不匹配,因为它给出了总输出counts@gm_datascience-答案已更改