根据Pandas中的现有列和值创建新列

时间:2018-04-26 17:17:34

标签: python pandas dataframe pivot-table pandas-groupby

(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中存在一种内置的方法,那将是一个在性能方面的巨大好处。

2 个答案:

答案 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)

编辑以处理mutli行

   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)