重塑和过滤熊猫数据框

时间:2018-12-27 22:55:58

标签: python pandas dataframe

我想从单元格等于1的下面(df1)数据框中筛选出所有值,并创建一个新的数据框,其中每一行都有相应单元格中的行和列(如下面的df2中所示):

for ($i=0; $i <= $data['jml_alternatif']; $i++) { 
 for ($i=0; $i <= ($this->input->post('iKriteria')-1); $i++) { 
$multiplication_result *= number_format(pow($rangking[$i]['nilai_rangking'], $data['bb_baru'][$i]),4); 
}
$data['vektor_s'][] = $multiplication_result;
}

有人可以建议这样做的方法吗?

3 个答案:

答案 0 :(得分:1)

您可以尝试查看数据框的值,并获取值大于0的索引数组。然后可以将索引中的索引和列名列表用于构建新的数据框。

var personExample: Person

答案 1 :(得分:1)

我认为最简单的方法如下:

df1.index.name = 'Ticker' # First reset the name so it will match your desired output (default is 'index')
df2 = df1.reset_index().melt(id_vars='Ticker',var_name='Date') # This unstacks the data

最后,将其设置为所需的形式,我们删除0,重置索引并进行排序:

df2 = df2[df2.value == 1].set_index('Ticker').filter(['Date','Ticker']).sort_index()

答案 2 :(得分:1)

这是@slayer和@Lucas H给出的方法的性能比较。我还添加了第三种方法。

@slayer method 
%%timeit 
1.12 ms ± 61.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

@Lucas H method
%%timeit
5.16 ms ± 735 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

@Third method
%%timeit
4.4 ms ± 232 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)


# Third method
df1 = df1.T
df2 = pd.melt(df1.where(df1==0, df1.index))
df2 = df2[df2.value != 0]
df2.columns = ['Ticker', 'Date']

@slayer的方法很明显胜过一切。