Как преобразовать ndarray в «высокий» Pandas DataFrame - PullRequest
0 голосов
/ 05 апреля 2020

Некоторая работа, которую я выполняю, приводит к выходному тензору (numpy ndarray) различных измерений, в зависимости от того, что меня интересует / хочет строить со временем, иногда я могу выбрать возрастные группы и пол в качестве моих целей, что в результате получится трехмерный тензор, в котором у нас будет

age_groups[
  genders[
    days[Value, ..., Value], 
    days[Value, ..., Value]
  ],
  ...,
  genders[
    days[Value, ..., Value]
    days[Value, ..., Value]
  ],
]

Мой вопрос заключается в том, как наиболее эффективно превратить это в кадр данных, который выглядит следующим образом:

     Age_Group  Gender  Day  Value
0    1          M       1    blah
1    1          F       1    blah
2    1          M       2    blah
4    1          F       2    blah
5    1          M       3    blah
6    1          F       3    blah
7    1          M       4    blah
...
n    5          F       21   blah

И как я могу это сделать? убедиться, что это можно обобщить, если я добавлю еще одну цель в группу, скажем, Цвет волос, чтобы в результирующий df был добавлен еще один столбец?

Извините, если этот вопрос несколько абстрактный, я надеюсь, что я проиллюстрировал проблема достаточно ясна, если нет, я могу попытаться уточнить дальше.

Ответы [ 2 ]

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

Предполагая, что ваш массив называется data:

data = ...
array = np.hstack([np.arange(data.size).reshape(-1, 1) % np.prod(data.shape[i:]) // np.prod(data.shape[i+1:])  for i in range(data.ndim)])
array = np.concatenate([array, data.reshape(-1, 1)])
df = pd.DataFrame(array, columns=['column names'])

Теперь вам просто нужно преобразовать половые столбцы в буквы, если хотите

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

Вы можете создать фрейм данных MultiIndex из сплюснутой версии вашего массива. Нет реального указания на то, что значения для ваших переменных в каждом индексе вашего трехмерного массива, но в произвольном порядке:

arr = np.arange(4*2*21).reshape(4, 2, 21)  # example array
ix = pd.MultiIndex.from_product(
    [[1, 2, 3, 4], ['M', 'F'], np.arange(1, 22)],
    names=['Age_Group', 'Gender', 'Day']
)
df = pd.DataFrame(arr.flatten(), index=ix, columns=['Value'])

Вывод:

     Age_Group Gender  Day  Value
0            1      M    1      0
1            1      M    2      1
2            1      M    3      2
3            1      M    4      3
4            1      M    5      4
..         ...    ...  ...    ...
163          4      F   17    163
164          4      F   18    164
165          4      F   19    165
166          4      F   20    166
167          4      F   21    167

Если порядок значения ваших переменных в каждом индексе различны, просто измените ваш ввод для функции from_product, чтобы он соответствовал вашему массиву.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...