#pandas #dataframe
Вопрос:
у вас есть df, который выглядит так:
data =
[{'len_overlap': 2, 'prox': 1.0, 'freq_sum_w': 0.03962264150943396},
{'len_overlap': 22, 'prox': np.nan, 'freq_sum_w': 0.0311111962264150943396}]
df = pd.DataFrame(data)
len_overlap | прокс | freq_sum_w | |
---|---|---|---|
0 | 2 | 1 | 0.0396226 |
1 | 22 | nan | 0.0311112 |
Я хочу сделать его кадром данных в одну строку, пока у меня есть это:
pd.DataFrame([np.ravel(df.values)], columns=sum([[f'{x}_{n}' for x in df.columns] for n in range(df.shape[0])], []))
len_overlap_0 | prox_0 | freq_sum_w_0 | лен_оверлап_1 | прокс_1 | freq_sum_в_1 | |
---|---|---|---|---|---|---|
0 | 2 | 1 | 0.0396226 | 22 | nan | 0.0311112 |
Это то, что я хочу (ints преобразуются в поплавки, не знаю почему, но это не проблема), но мне интересно, есть ли более приятный, более Панд способ сделать это.
Спасибо
Ответ №1:
Попробуйте через unstack()
, to_frame()
и Transpose(T)
атрибут:
out=df.unstack().to_frame().T
Окончательно:
out.columns=out.columns.map(lambda x:'_'.join(map(str,x)))
выход из out
:
len_overlap_0 len_overlap_1 prox_0 prox_1 freq_sum_w_0 freq_sum_w_1
0 2.0 22.0 1.0 NaN 0.039623 0.031111
Ответ №2:
Одна строка, но более сложная:
>>> df.unstack()
.to_frame()
.set_index(pd.MultiIndex.from_product([df.columns, df.index.astype(str)])
.sortlevel(1)[0]
.to_flat_index()
.map('_'.join))
.transpose()
freq_sum_w_0 len_overlap_0 prox_0 freq_sum_w_1 len_overlap_1 prox_1
0 2.0 22.0 1.0 NaN 0.039623 0.031111
ИМХО, я думаю, что «больше панд» — это использовать MultiIndex
:
>>> df.stack().to_frame().transpose()
0 1
len_overlap prox freq_sum_w len_overlap freq_sum_w
0 2.0 1.0 0.039623 22.0 0.031111
или лучше (например pd.melt
):
>>> df.stack()
0 len_overlap 2.000000
prox 1.000000
freq_sum_w 0.039623
1 len_overlap 22.000000
freq_sum_w 0.031111
Ответ №3:
Попробуй,
df_out = df.unstack()
df_out = df_out.sort_index(level=1)
df_out.index = [f'{i}_{j}' for i, j in df_out.index]
df_out.to_frame().T
Выход:
freq_sum_w_0 len_overlap_0 prox_0 freq_sum_w_1 len_overlap_1 prox_1
0 0.039623 2.0 1.0 0.031111 22.0 NaN