новый фрейм данных с использованием значений в существующем фрейме данных - PullRequest
1 голос
/ 08 мая 2020
exdf = pd.DataFrame({'Employee name': ['Alex','Mike'],
 '2014.1': [5, 2], '2014.2': [3, 4], '2014.3': [3, 6], '2014.4': [4, 3], '2015.1': [7, 5], '2015.2': [5, 4]})
exdf


  Employee name  2014.1  2014.2  2014.3  2014.4  2015.1  2015.2
0          Alex       5       3       3       4       7       5
1          Mike       2       4       6       3       5       4

Предположим, что в приведенном выше фрейме данных есть несколько таких строк и столбцов с выходными данными каждого сотрудника за каждый квартал. Я хочу создать новый фрейм данных со столбцами:

newdf=pd.Dataframe(columns=['Employee name','Year','Quarter','Output'])

Итак, новый фрейм данных будет иметь nxm строк, где n и m - строки и столбцы в исходном фрейме данных. Я пробовал заполнять каждую запись строки и столбца, используя вложенные для l oop.

Но я уверен, что есть более эффективный метод.

for i in range(df.shape[0]):
    for j in range(df.shape[1]):
        newdf.iloc[?]=exdf.iloc[?]

Ответы [ 2 ]

5 голосов
/ 08 мая 2020

Используйте DataFrame.melt с Series.str.split, последний порядок изменения столбцов:

df = exdf.melt('Employee name', var_name='Year', value_name='Output')
df[['Year', 'Quarter']] = df['Year'].str.split('.', expand=True)
df = df[['Employee name','Year','Quarter','Output']]
print (df)
   Employee name  Year Quarter  Output
0           Alex  2014       1       5
1           Mike  2014       1       2
2           Alex  2014       2       3
3           Mike  2014       2       4
4           Alex  2014       3       3
5           Mike  2014       3       6
6           Alex  2014       4       4
7           Mike  2014       4       3
8           Alex  2015       1       7
9           Mike  2015       1       5
10          Alex  2015       2       5
11          Mike  2015       2       4
0 голосов
/ 08 мая 2020

Преобразуйте столбцы в multiIndex , используя str.split , затем u stack столбцы, чтобы получить окончательный вывод ur

#set Employee name as index
exdf = exdf.set_index('Employee name')

#convert columns to multiIndex
exdf.columns = exdf.columns.str.split('.',expand = True)
exdf.columns = exdf.columns.set_names(['year','quarter'])

#stack data and give column a name
(exdf
 .stack(["year","quarter"])
 .reset_index(name='output')
)


Employee name   year    quarter output
0   Alex        2014       1    5.0
1   Alex        2014       2    3.0
2   Alex        2014       3    3.0
3   Alex        2014       4    4.0
4   Alex        2015       1    7.0
5   Alex        2015       2    5.0
6   Mike        2014       1    2.0
7   Mike        2014       2    4.0
8   Mike        2014       3    6.0
9   Mike        2014       4    3.0
10  Mike        2015       1    5.0
11  Mike        2015       2    4.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...