Это не совсем то, что вы ищете, но я не уверен, что «транспонирование» существует как простая функция. (Кстати, transpose
, следуя линейной алгебре, обычно означает поворот кадра данных на 90 °).
# get items
items = []
for c in df.columns[1:]:
items.extend(df[c].values)
items = list(set(items))
items.remove(None)
people = df.Person.values
counts = {}
for p in people:
counts[p] = [1 if item in df[df['Person'] == p].values else 0 for item in items]
new = pd.DataFrame(counts, index=items)
new['Count'] = new.sum(axis=1)
Выход:
| | Adam | Alex | Gina | Count |
|-----------|------|------|------|-------|
| Cookie | 1 | 0 | 0 | 1 |
| Chocolate | 0 | 1 | 0 | 1 |
| Potato | 0 | 1 | 0 | 1 |
| Eggs | 1 | 1 | 1 | 3 |
| Milk | 0 | 0 | 1 | 1 |
| Orange | 0 | 1 | 1 | 2 |
| Apple | 1 | 0 | 1 | 2 |
РЕДАКТИРОВАТЬ: как обычно, у Jezrael есть правильный ответ, но я настроил это, чтобы получить желаемый результат. Это может быть немного проще для начинающего.
В качестве примера приведем 'df':
item_counts = {}
for item in items:
counts = {}
count = 0
for p in people:
if item in df[df['Person'] == p].values:
count += 1
counts['Person' + str(count)] = p
counts['count'] = count
item_counts[item] = counts
new = pd.DataFrame.from_dict(item_counts, orient='index')
new = new[['count', 'Person1', 'Person2', 'Person3']] # rearrange columns, optional
Выход:
| | count | Person1 | Person2 | Person3 |
|-----------|-------|---------|---------|---------|
| Apple | 2 | Adam | Gina | NaN |
| Chocolate | 1 | Alex | NaN | NaN |
| Cookie | 1 | Adam | NaN | NaN |
| Eggs | 3 | Adam | Alex | Gina |
| Milk | 1 | Gina | NaN | NaN |
| Orange | 2 | Alex | Gina | NaN |
| Potato | 1 | Alex | NaN | NaN |