Как подсчитать наличие разных значений в длинном списке столбцов с указанием c с Python? - PullRequest
1 голос
/ 30 апреля 2020

У меня здесь 25 столбцов и 5 строк. Мне нужно посчитать значения в указанных c столбцах только один раз на строку. Присутствовало ли значение «1» в этой строке данных между этими столбцами? Если да, то посчитай. И так далее с другими ценностями.

Существуют и другие столбцы, которые также содержат эти значения, но они не должны учитываться в этих столбцах. Только столбцы xy, x = [1,2] и y = [1,2,3,4,5,6,7,8,9,10]. Не x = ['a', 'b', 'c', 'd', 'e'].

Редактировать: Объяснено по-другому: «между этими столбцами, во сколько строк появляется 1, во сколько строк появляется 2 ...»

data = {'Column 1 1':     [ 1, 3, 3, 2, 4], 
        'Column 1 2':     [ 3,'', 4, 3, 5], 
        'Column 1 3':     [ 4,'', 3, 4, 7],
        'Column 1 4':     ['','', 4, 1, 7],
        'Column 1 5':     ['','', 6, 5, 8],
        'Column 1 6':     ['','', 6,'', 3],
        'Column 1 7':     ['','', 8,'', 2],
        'Column 1 8':     ['','', 3,'',''],
        'Column 1 9':     ['','', 1,'',''],
        'Column 1 10':    ['','', 7,'',''],
        'Column 2 1':     [ 2, 5, 5, 1, 4], 
        'Column 2 2':     ['','', 4, 3,''], 
        'Column 2 3':     ['','','', 2, 7],
        'Column 2 4':     ['','', 4, 1,''],
        'Column 2 5':     ['','', 7, 5, 8],
        'Column 2 6':     ['','', 6,'', 3],
        'Column 2 7':     ['','','','', 2],
        'Column 2 8':     ['','','','',''],
        'Column 2 9':     ['','','','',''],
        'Column 2 10':    ['','', 8,'',''],
        'Column a':       [ 1, 2, 4, 5, 5],
        'Column b':       [ 8, 7, 6, 3, 2],
        'Column c':       [ 7, 3, 4, 3, 2],
        'Column d':       [ 2, 2, 3, 7, 7],
        'Column e':       [ 4, 3, 7, 4, 1]}

df = pd.DataFrame(data=data)

То, что я хочу, это фрейм данных с таблицей, которая показывает

  • 1: 3
  • 2: 3
  • 3: 5 (обратите внимание, что он не учитывается дважды для строки, если он появляется более одного раза)
  • 4: 4
  • 5: 4
  • 6: 1
  • 7: 2
  • 8: 2

.value_counts () позволяет мне делать только один столбец за раз, и если я суммирую данные value_counts для всех этих 20 столбцов, это даст мне слишком большое число, потому что некоторые появляются в большем количестве столбцов для каждого ряда.

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Стратегия заключается в том, чтобы объединить ваши данные в строки, пары значений, а затем подсчитать их различные наборы. Сначала получите столбцы, которые вы хотите сохранить в виде списка:

cols = [f"Column {x} {y}" for y in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] for x in [1, 2]]

Затем транспонируйте свои данные, чтобы у вас был столбец для каждой строки и строка для каждого столбца:

df[cols].transpose()                                                                                                                                                                               

             0  1  2  3  4
Column 1 1   1  3  3  2  4
Column 2 1   2  5  5  1  4
Column 1 2   3     4  3  5
Column 2 2         4  3   
Column 1 3   4     3  4  7
...

Затем объедините это в переменную, пары значений («переменная» - строка) и дедуплицируйте:

df[cols].transpose().melt().drop_duplicates()

    variable value
0          0     1
1          0     2
2          0     3
3          0      
4          0     4
20         1     3
21         1     5
22         1      
...

Наконец, сгруппируйте по вашим значениям и получите количество различных строк, каждая из которых появляется в :

df[cols].transpose().melt().drop_duplicates().groupby('value').count()        

       variable
value          
1             3
2             3
3             5
4             4
5             4
6             1
7             2
8             2
              5

Отфильтруйте пробелы перед группой, если хотите.

0 голосов
/ 30 апреля 2020

ПРИМЕЧАНИЕ: я заменил '' на 0 в вашем фрейме данных.

Затем я создал серию, которая содержала все уникальные значения в каждой строке.


def get_unique(x):
    return np.unique(x.values)
df2 = df.apply(get_unique,axis=1)
df2
0       [0, 1, 2, 3, 4, 7, 8]
1             [0, 2, 3, 5, 7]
2    [0, 1, 3, 4, 5, 6, 7, 8]
3       [0, 1, 2, 3, 4, 5, 7]
4    [0, 1, 2, 3, 4, 5, 7, 8]
dtype: object

Затем я подсчитал вхождение значений в каждый массив уникальных значений.

pd.Series({i: df2.map(lambda x: i in x).sum() for i in range(10)})
0    5
1    4
2    4
3    5
4    4
5    4
6    1
7    5
8    3
9    0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...