#python #pandas #numpy #keras
#python #pandas #numpy #keras
Вопрос:
Я хочу использовать CNN для некоторой таблицы данных (dataframe или ndarray), но у меня разные данные строки в каждом индексе.
Источник :
mIndex valueA valueB
------ ------ --------
1 111 10
1 112 20
2 222 30
2 221 40
2 223 50
3 333 60
Надеюсь: (максимум 3 строки в каждом индексе)
mIndex valueA valueB
------ ------ --------
1 111 10
1 112 20
1 0 0
2 222 30
2 221 40
2 223 50
3 333 60
3 0 0
3 0 0
Я хочу сделать это для торговли CNN.
Но возможно ли это сделать в функции numpy или keras?
Пожалуйста, помогите. Заранее спасибо.
Ответ №1:
Способ 1
Сначала примените np.array
для получения массивов, затем примените pd.Series
, чтобы в основном преобразовать значения каждого столбца в строку, чтобы мы могли использовать stack для преобразования. После этого мы используем stack
и сохраняем NaN
.
В конце мы concat
все фреймы данных в один конечный фрейм данных axis=1
cols = ['valueA', 'valueB']
dfs = []
for col in cols:
dfs.append(df.groupby('mIndex')[col].apply(np.array)
.apply(pd.Series)
.stack(dropna=False).reset_index(level=0)
.rename({0:col}, axis=1))
df_final = pd.concat(dfs, axis=1).reset_index(drop=True)
print(df_final)
mIndex valueA mIndex valueB
0 1 111.0 1 10.0
1 1 112.0 1 20.0
2 1 NaN 1 NaN
3 2 222.0 2 30.0
4 2 221.0 2 40.0
5 2 223.0 2 50.0
6 3 333.0 3 60.0
7 3 NaN 3 NaN
8 3 NaN 3 NaN
Способ 2
мы можем groupby
получить доступ к элементам
df= pd.concat([
d.reset_index(drop=True).reindex(range(3))
for n, d in df.groupby('mIndex')
], ignore_index=True)
print(df)
mIndex valueA valueB
0 1.0 111.0 10.0
1 1.0 112.0 20.0
2 NaN NaN NaN
3 2.0 222.0 30.0
4 2.0 221.0 40.0
5 2.0 223.0 50.0
6 3.0 333.0 60.0
7 NaN NaN NaN
8 NaN NaN NaN
Ответ №2:
Я могу сделать это только тупым способом, может быть, у кого-то есть лучшее решение:
# df
mIndex valueA valueB
0 1 a a
1 2 b b
2 2 b b
3 3 c c
Поехали:
# get number of required padding
nPad = df.groupby('mIndex').mIndex.count().transform(lambda x: 3-x)
# get paddings
pads = []
for i, row in nPad.items():
for _ in range(row):
pads.append([i, 0, 0])
pads = pd.DataFrame(pads, columns=df.columns)
# padding
df = pd.concat([df, pads], ignore_index=True)
.set_index('mIndex').sort_values('mIndex')
После заполнения:
mIndex valueA valueB
1 a a
1 0 0
1 0 0
2 b b
2 b b
2 0 0
3 c c
3 0 0
3 0 0
Комментарии:
1. @Erfan Что не так? Порядок? Вы можете использовать
groupby
снова.2. Добавить
df = pd.concat([df, pads], ignore_index=True).sort_values('mIndex')