Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫-如果排名前2,则排名第1_Python_Pandas - Fatal编程技术网

Python 熊猫-如果排名前2,则排名第1

Python 熊猫-如果排名前2,则排名第1,python,pandas,Python,Pandas,我有一个数据帧,如下所示: df = pd.DataFrame({'Date': ['02/01/2019', '03/01/2019', '04/01/2019', '07/01/2019', '08/01/2019', '09/01/2019', '10/01/2019', '11/01/2019', '14/01/2019', '15/01/2019'], 'VOD': [3, 2.3, 2, 1.8, 2, 4, 5, 4, 3, 1],

我有一个数据帧,如下所示:

df = pd.DataFrame({'Date': ['02/01/2019', '03/01/2019', '04/01/2019', '07/01/2019', '08/01/2019', '09/01/2019', '10/01/2019', '11/01/2019', '14/01/2019', '15/01/2019'],
                   'VOD': [3, 2.3, 2, 1.8, 2, 4, 5, 4, 3, 1],
                   'BBY': [0.9, 1, 1.2, 1, 1, 2.3, 2.4, 2.5, 3, 2.9],
                   'STJ': [4, 4.2, 4.3, 4.4, 3.5, 3, 2, 1, 1.2, 2],
                   'RBS': [0.5, 0.6, 0.7, 0.6, 1, 1.2, 1.3, 1.4, 1.5, 2]})
df1 = df.rank(1, ascending=False, method='first')
result = pd.DataFrame({'Date': ['02/01/2019', '03/01/2019', '04/01/2019', '07/01/2019', '08/01/2019', '09/01/2019', '10/01/2019', '11/01/2019', '14/01/2019', '15/01/2019'],
                       'VOD': [1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
                       'BBY': [0,0,0,0,0,0,1,1,1,1],
                       'STJ': [1,1,1,1,1,1,0,0,0,1],
                       'RBS': [0,0,0,0,0,0,0,0,0,0]})
从这个数据框架中,我可以按列对每一行进行排序,如下所示:

df = pd.DataFrame({'Date': ['02/01/2019', '03/01/2019', '04/01/2019', '07/01/2019', '08/01/2019', '09/01/2019', '10/01/2019', '11/01/2019', '14/01/2019', '15/01/2019'],
                   'VOD': [3, 2.3, 2, 1.8, 2, 4, 5, 4, 3, 1],
                   'BBY': [0.9, 1, 1.2, 1, 1, 2.3, 2.4, 2.5, 3, 2.9],
                   'STJ': [4, 4.2, 4.3, 4.4, 3.5, 3, 2, 1, 1.2, 2],
                   'RBS': [0.5, 0.6, 0.7, 0.6, 1, 1.2, 1.3, 1.4, 1.5, 2]})
df1 = df.rank(1, ascending=False, method='first')
result = pd.DataFrame({'Date': ['02/01/2019', '03/01/2019', '04/01/2019', '07/01/2019', '08/01/2019', '09/01/2019', '10/01/2019', '11/01/2019', '14/01/2019', '15/01/2019'],
                       'VOD': [1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
                       'BBY': [0,0,0,0,0,0,1,1,1,1],
                       'STJ': [1,1,1,1,1,1,0,0,0,1],
                       'RBS': [0,0,0,0,0,0,0,0,0,0]})
我正在尝试将1分配给排名前两名(第一排是VOD和STJ),将0分配给其他人

我的目标是最终得到一张表,如下所示:

df = pd.DataFrame({'Date': ['02/01/2019', '03/01/2019', '04/01/2019', '07/01/2019', '08/01/2019', '09/01/2019', '10/01/2019', '11/01/2019', '14/01/2019', '15/01/2019'],
                   'VOD': [3, 2.3, 2, 1.8, 2, 4, 5, 4, 3, 1],
                   'BBY': [0.9, 1, 1.2, 1, 1, 2.3, 2.4, 2.5, 3, 2.9],
                   'STJ': [4, 4.2, 4.3, 4.4, 3.5, 3, 2, 1, 1.2, 2],
                   'RBS': [0.5, 0.6, 0.7, 0.6, 1, 1.2, 1.3, 1.4, 1.5, 2]})
df1 = df.rank(1, ascending=False, method='first')
result = pd.DataFrame({'Date': ['02/01/2019', '03/01/2019', '04/01/2019', '07/01/2019', '08/01/2019', '09/01/2019', '10/01/2019', '11/01/2019', '14/01/2019', '15/01/2019'],
                       'VOD': [1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
                       'BBY': [0,0,0,0,0,0,1,1,1,1],
                       'STJ': [1,1,1,1,1,1,0,0,0,1],
                       'RBS': [0,0,0,0,0,0,0,0,0,0]})
我认为if语句可以工作,但不能与rank()一起工作。这些想法非常受欢迎

import pandas as pd

df = pd.DataFrame({'Date': ['02/01/2019', '03/01/2019', '04/01/2019', '07/01/2019', '08/01/2019', '09/01/2019', '10/01/2019', '11/01/2019', '14/01/2019', '15/01/2019'],
                   'VOD': [3, 2.3, 2, 1.8, 2, 4, 5, 4, 3, 1],
                   'BBY': [0.9, 1, 1.2, 1, 1, 2.3, 2.4, 2.5, 3, 2.9],
                   'STJ': [4, 4.2, 4.3, 4.4, 3.5, 3, 2, 1, 1.2, 2],
                   'RBS': [0.5, 0.6, 0.7, 0.6, 1, 1.2, 1.3, 1.4, 1.5, 2]})


ranked_cols = ['VOD','BBY','STJ','RBS']
ranked = df[ranked_cols].rank(axis=1, ascending=False, method='first')

def allocate_ones(x):
    if x in (1, 2):  # top 2 ranked
        return 1
    else:
        return 0

allocated = ranked.applymap(allocate_ones)
现在重新附加日期列:

allocated['Date'] = df['Date']
输出:

   VOD  BBY  STJ  RBS        Date
0    1    0    1    0  02/01/2019
1    1    0    1    0  03/01/2019
2    1    0    1    0  04/01/2019
3    1    0    1    0  07/01/2019
4    1    0    1    0  08/01/2019
5    1    0    1    0  09/01/2019
6    1    1    0    0  10/01/2019
7    1    1    0    0  11/01/2019
8    1    1    0    0  14/01/2019
9    0    1    1    0  15/01/2019
现在重新附加日期列:

allocated['Date'] = df['Date']
输出:

   VOD  BBY  STJ  RBS        Date
0    1    0    1    0  02/01/2019
1    1    0    1    0  03/01/2019
2    1    0    1    0  04/01/2019
3    1    0    1    0  07/01/2019
4    1    0    1    0  08/01/2019
5    1    0    1    0  09/01/2019
6    1    1    0    0  10/01/2019
7    1    1    0    0  11/01/2019
8    1    1    0    0  14/01/2019
9    0    1    1    0  15/01/2019
对于
True/False
1/0
映射,与转换为整数一起使用:

cols = ['VOD','BBY','STJ','RBS']
df[cols] = df[cols].rank(axis=1, ascending=False, method='first').isin([1,2]).astype(int)
或使用:

对于
True/False
1/0
映射,与转换为整数一起使用:

cols = ['VOD','BBY','STJ','RBS']
df[cols] = df[cols].rank(axis=1, ascending=False, method='first').isin([1,2]).astype(int)
或使用:


我不理解排名逻辑。你能再解释一下吗?df是一组按df1排序的数字。使用df1,我只尝试在结果中返回1或0。这实际上是一个二进制的买入、卖出或持有信号。我不理解排名逻辑。你能再解释一下吗?df是一组按df1排序的数字。使用df1,我只尝试在结果中返回1或0。这实际上是一个二进制买入、卖出或持有信号