(1)考虑以下DataFrame:
puts "/opt/scanner/$LINE/dump"
puts "$LINE"
有没有办法到达下一行:
d e val
-----------------
1 0 40 125
2 10 35 150
3 11 30 110
4 15 65 115
这很容易通过手动迭代行来完成,但理想情况下我正在寻找矢量化解决方案。基本上,我认为我之后的是基于某些列名+列值创建/分配行的方法。
(2)下一步是按列分组,每个值实际输出一行。要构建上面的示例,请执行以下操作:
val_0 val_10 val_11 val_15 e_0 e_10 e_11 e_15
-----------------------------------------------------------------------
1 125 150 110 115 40 35 30 65
输出:
d e val gp
----------------------
1 0 40 125 3
2 10 35 150 3
3 11 30 110 3
4 15 65 115 3
1 0 70 225 4
2 10 85 250 4
3 11 90 210 4
4 15 95 215 4
同样,在解决(1)时做(2)可以用简单的gp val_0 val_10 val_11 val_15 e_0 e_10 e_11 e_15
-------------------------------------------------------------------
3 125 150 110 115 40 35 30 65
4 225 250 210 215 70 85 90 95
完成,但如果在Pandas中存在一种内置的方法,那将是一个在性能方面的巨大好处。
答案 0 :(得分:1)
这是原始问题的一个解决方案。
val = pd.Series(df['val'].values, index='val_'+df['d'].apply(str))
e = pd.Series(df['e'].values, index='e_'+df['e'].apply(str))
res = pd.concat([val, e]).to_frame().T
print(res)
val_0 val_10 val_11 val_15 e_40 e_35 e_30 e_65
0 125 150 110 115 40 35 30 65
答案 1 :(得分:1)
您可以使用一些数据框整形和列标题展平:
SELECT COUNT(*)
FROM listing_category
JOIN (
SELECT id FROM category1
UNION
SELECT id FROM category2
);
输出:
df_out = df.set_index('d').unstack().to_frame().T
df_out.columns = df_out.columns.map('{0[0]}_{0[1]}'.format)
e_0 e_10 e_11 e_15 val_0 val_10 val_11 val_15
0 40 35 30 65 125 150 110 115
输出:
df_out = df.set_index(['gp','d']).unstack()
df_out.columns = df_out.columns.map('{0[0]}_{0[1]}'.format)