如果值在给定列表中存在于多列中,并计算列数

时间:2019-09-27 06:13:34

标签: 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           1
1           1
2           2
3           1
4           1
5           1
7           1
9           1
10          1
11          2
12          1
15          1

表示每个值,其可用的列数 我想要那个输出

2 个答案:

答案 0 :(得分:3)

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

# your input df as a list of lists
df = [[2,11,12,5], [2,0,10,9], [4,5,1,7], [11,3,11,15]]

#remove duplicates in each list
dfU = [list(set(l)) for l in df]

# sort each list (not required for this approach)
for l in dfU: 
    l.sort()

# the requested unique list
flatList = [item for sublist in df for item in sublist]
uniqueList = list(set(flatList))
print(uniqueList)

# output as a list of lists
output = []
for num in uniqueList:
    cnt = 0
    for idx in range(len(dfU)):
        if dfU[idx].count(num) > 0:
            cnt+=1
    output.append([num,cnt])

print(output)

请注意,count函数的计算量很大,因此最好对所有已排序的列进行线性扫描。

答案 1 :(得分:3)

使用DataFrame.melt进行整形,删除两列中的重复项,并用GroupBy.size来计算DataFrame中的Series.reset_index

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

已删除索引11的一个14

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