если значения существуют из данного списка в нескольких столбцах и подсчитывают количество столбцов - PullRequest
3 голосов
/ 27 сентября 2019

у меня ниже df

B      C     D         E
2      2     4         11    
11     0     5         3
12     10    1         11
5      9     7         15 

1-й, я хочу уникальное значение из целого 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 ]

3 голосов
/ 27 сентября 2019

Используйте DataFrame.melt для изменения формы, удалите дубликаты по обоим столбцам и сосчитайте до GroupBy.size с Series.reset_index для DataFrame:

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
3 голосов
/ 27 сентября 2019

Используя 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 требует больших вычислительных затрат, поэтому было бы лучше выполнить линейное сканирование по всем отсортированным столбцам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...