我想从单元格等于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;
}
有人可以建议这样做的方法吗?
答案 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的方法很明显胜过一切。