Сворачивающиеся столбцы с одинаковыми именами содержат разные данные - PullRequest
0 голосов
/ 12 февраля 2019

У меня трудности с фреймом данных такой структуры:

| Depart | Employee | Employee_card | 1  | 2  | 1  | 2  |
|:------:|:--------:|:-------------:|:--:|:--:|:--:|:--:|
| Dep_1  |  Emp_1   |      101      | 97 | 16 | 38 | 86 |
| Dep_2  |  Emp_2   |      102      | 7  | 10 | 3  | 58 |
| Dep_2  |  Emp_3   |      103      | 15 | 96 | 8  | 36 |
| Dep_1  |  Emp_4   |      104      | 41 | 12 | 40 | 49 |
| Dep_3  |  Emp_5   |      105      | 75 | 88 | 60 | 26 |
| Dep_1  |  Emp_6   |      106      | 37 | 51 | 33 | 31 |
| Dep_3  |  Emp_7   |      107      | 64 | 90 | 13 | 34 |

Не спрашивайте, почему существуют глупые столбцы «1» и «2».У меня действительно это есть.

Я хочу преобразовать этот фрейм данных в структуру, подобную структуре:

| Depart | Employee | Employee_card | 1  | 2  |
|:------:|:--------:|:-------------:|:--:|:--:|
| Dep_1  |  Emp_1   |      101      | 97 | 16 |
|        |  Emp_4   |      104      | 41 | 12 | 
|        |  Emp_6   |      106      | 37 | 51 |
|        |  Emp_1   |      101      | 38 | 86 |
|        |  Emp_4   |      104      | 40 | 49 |
|        |  Emp_6   |      106      | 33 | 31 |
| Dep_2  |  Emp_2   |      102      | 7  | 10 |
|        |  Emp_3   |      103      | 15 | 96 |
|        |  Emp_2   |      102      | 3  | 58 |
|        |  Emp_3   |      103      | 8  | 36 |
| Dep_3  |  Emp_5   |      105      | 75 | 88 |
|        |  Emp_7   |      107      | 64 | 90 |
|        |  ...     |     ...       | ...| ...|

, но не могу понять, как я мог это сделать.Либо я должен использовать группу по выражению или MultiIndex.Или сводная таблица ...

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

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

_, i = np.unique(df.columns, return_index=True)
df_with_unique_cols = df.iloc[:,i]
0 голосов
/ 12 февраля 2019

Сначала создайте необработанный фрейм данных:

import pandas as pd

data = [
    {'Depart': 'Dep_1', 'Employee': 'Emp_1', 'Employee_card': '101', '1': '97', '2': '16', '1_1': '38', '2_2': '86'},
    {'Depart': 'Dep_2', 'Employee': 'Emp_2', 'Employee_card': '102', '1': '7', '2': '10', '1_1': '3', '2_2': '58'},
    {'Depart': 'Dep_2', 'Employee': 'Emp_3', 'Employee_card': '103', '1': '15', '2': '96', '1_1': '8', '2_2': '36'},
    {'Depart': 'Dep_1', 'Employee': 'Emp_4', 'Employee_card': '104', '1': '41', '2': '12', '1_1': '40', '2_2': '49'},
    {'Depart': 'Dep_3', 'Employee': 'Emp_5', 'Employee_card': '105', '1': '75', '2': '88', '1_1': '60', '2_2': '26'},
    {'Depart': 'Dep_1', 'Employee': 'Emp_6', 'Employee_card': '106', '1': '37', '2': '51', '1_1': '33', '2_2': '31'},
    {'Depart': 'Dep_3', 'Employee': 'Emp_7', 'Employee_card': '107', '1': '64', '2': '90', '1_1': '13', '2_2': '34'}
]

raw = pd.DataFrame(data)

print(raw)

# 1 1_1   2 2_2 Depart Employee Employee_card
# 0  97  38  16  86  Dep_1    Emp_1           101
# 1   7   3  10  58  Dep_2    Emp_2           102
# 2  15   8  96  36  Dep_2    Emp_3           103
# 3  41  40  12  49  Dep_1    Emp_4           104
# 4  75  60  88  26  Dep_3    Emp_5           105
# 5  37  33  51  31  Dep_1    Emp_6           106
# 6  64  13  90  34  Dep_3    Emp_7           107

После этого вы можете растопить и объединить результат с новым фреймом данных:

shared_vars = ['Depart', 'Employee', 'Employee_card']

df1 = raw.melt(id_vars=shared_vars, value_vars=['1', '1_1'], var_name='_',
               value_name='1').drop('_', 1).set_index(shared_vars)
df2 = raw.melt(id_vars=shared_vars, value_vars=['2', '2_2'], var_name='_',
               value_name='2').drop('_', 1).set_index(shared_vars)

df = pd.concat([df1, df2], axis=1)\
    .astype({'1': int, '2': int})\  # for sorting
    .sort_values(by=shared_vars + ['1', '2'])  # sort all columns

print(df)

#                                1   2
# Depart Employee Employee_card
# Dep_1  Emp_1    101            38  86
#                 101            97  16
#        Emp_4    104            40  49
#                 104            41  12
#        Emp_6    106            33  31
#                 106            37  51
# Dep_2  Emp_2    102             3  58
#                 102             7  10
#        Emp_3    103             8  36
#                 103            15  96
# Dep_3  Emp_5    105            60  26
#                 105            75  88
#        Emp_7    107            13  34
#                 107            64  90
0 голосов
/ 12 февраля 2019

имена первых отдельных столбцов и создание временного df2

df.columns = ['Depart', 'Employee', 'Employee_card', 'A', 'B', 'C', 'D']
df2 = df[['Depart','Employee', 'Employee_card ', 'C', 'D']]

, переименование столбцов df2 и удаление столбцов 'C' и 'D' из df

df2.columns = ['Depart','Employee', 'A','B']
del df[['C', 'D']]

, затем конкататация 2DF's

df3 = pd.concat([df,df2])
...