Как получить и посчитать манекены одновременно - PullRequest
2 голосов
/ 31 марта 2020

У меня есть большой набор данных, который мне пришлось очистить. Теперь, упрощенно, у меня есть это:

   A  B  C  D
1  1  5  2  2
4  2  5  3  1
5  3  3  2  1
8  4  1  4  4

Итак, значения для каждого столбца идут от 1 до 5. Теперь я хочу преобразовать эти 4 столбца в 5 фиктивных столбцов и подсчитать одновременно сумму «значений» для каждой строки каждого значения, для того, чтобы иметь:

   S_1 S_2 S_3 S_4 S_5
1   1   2   0   0   1
4   1   1   1   0   1
5   1   1   2   0   0
8   1   0   0   3   0

Таким образом, «S_1» представляет количество «1» для каждой строки, «S_2» количество «2» каждой строки и т. д.

Я полагаю, это возможно с помощью сводной таблицы, но я не могу этого сделать. Кто-нибудь может мне помочь, пожалуйста?

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Один из подходов заключается в использовании коллекций. Счетчик :

import pandas as pd
from collections import Counter

data = [[1, 5, 2, 2],
        [2, 5, 3, 1],
        [3, 3, 2, 1],
        [4, 1, 4, 4]]

df = pd.DataFrame(data=data, columns=['A', 'B', 'C', 'D'], index=[1, 4, 5, 8])

total = {k: 0 for k in range(1, 6)}

result = pd.DataFrame([{**total, **Counter(row)} for row in df.values], index=df.index)

result = result.rename(columns={k: f'S_{k}' for k in total}).fillna(0)

print(result)

Выход

   S_1  S_2  S_3  S_4  S_5
1    1    2    0    0    1
4    1    1    1    0    1
5    1    1    2    0    0
8    1    0    0    3    0

Использование счетчика для подсчета случаев, выражение:

{**total, **Counter(row)}

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

0 голосов
/ 31 марта 2020

Вы можете попробовать это, надеюсь, это поможет

import pandas as pd
from collections import defaultdict # Initialize a dictionary with a default value

df = pd.DataFrame(
    [[1,5,2,2],
     [2,5,3,1],
     [3,3,2,1],
     [4,1,4,4]]
    , columns = ['A','B','C','D'])


categories = [1,2,3,4,5]

# Count per row
rows_counts = []
for idx in df.index:
    dict_counts = defaultdict(int)

    # Count for each category
    for category in categories:
        # Get row as list to count()
        row = df.loc[idx,:].tolist()

        # Count
        dict_counts[category] = row.count(category)

    # Append results
    rows_counts.append(dict_counts)

# Get desired output    
new_df = pd.DataFrame(rows_counts)
new_df.columns = ['S_'+ str(cat) for cat in new_df.columns]

...