Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.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)行中的前n个值_Python - Fatal编程技术网

查找数据帧(Python)行中的前n个值

查找数据帧(Python)行中的前n个值,python,Python,我想在数据帧的一行中找到前n个值 实例: data = {'First': [1, 2,3], 'Second': [2,1,5], 'Third': [5,1,2] } df = pd.DataFrame (data, columns = ['First','Second','Third']) First Second Third 0 1 2 5 1 2 1 3 2 3 5 2 我想遍历每一行并选择前

我想在数据帧的一行中找到前n个值

实例:

data = {'First':  [1, 2,3],
        'Second': [2,1,5],
         'Third': [5,1,2]
        }
df = pd.DataFrame (data, columns = ['First','Second','Third'])

 First Second Third
0   1   2   5
1   2   1   3
2   3   5   2
我想遍历每一行并选择前n个值。在本例中,输入前2名,并将值替换为1,将所有其他值替换为0

因此,我期望的输出如下所示:

 First Second Third
0   0   1   1
1   1   0   1
2   1   1   0
一个解决方案使用

out=df.rank(axis=1).lte(2)
从文档中确定适合您的排名方法。

使用

out=df.rank(axis=1).lte(2)

从文档中确定适合您的排序方法。

您可以使用
df.rank
,将method设置为
min
,并获得大于
列数的列数-2
,这与
(df.shape[1]-n)
相同,以获得前2名。然后
astype
int
-

data = {'First':  [1, 2,3],
        'Second': [2,1,5],
         'Third': [5,3,2]
        }
df = pd.DataFrame (data, columns = ['First','Second','Third'])


n = 2 #define top n

(df.rank(1)>(df.shape[1]-n)).astype(int)
备选方案:您也可以使用numpy解决此问题。double argsort按行返回每个数字的排列顺序。在这种情况下,排名前n的阈值将减少一个,因为排名从0开始-

new_data = (df.to_numpy().argsort(1).argsort()>(df.shape[1]-n-1)).astype(int)
df2 = pd.DataFrame(new_data, columns = ['First','Second','Third'])
print(df2)

您可以使用
df.rank
,将method设置为
min
,并获得大于
的列数-2
,这与
(df.shape[1]-n)
相同,以获得前2名。然后
astype
int
-

data = {'First':  [1, 2,3],
        'Second': [2,1,5],
         'Third': [5,3,2]
        }
df = pd.DataFrame (data, columns = ['First','Second','Third'])


n = 2 #define top n

(df.rank(1)>(df.shape[1]-n)).astype(int)
备选方案:您也可以使用numpy解决此问题。double argsort按行返回每个数字的排列顺序。在这种情况下,排名前n的阈值将减少一个,因为排名从0开始-

new_data = (df.to_numpy().argsort(1).argsort()>(df.shape[1]-n-1)).astype(int)
df2 = pd.DataFrame(new_data, columns = ['First','Second','Third'])
print(df2)

您可以创建一个助手函数,用于根据值是否适合top2将其转换为0或1。 然后可以通过
apply
方法将此函数应用于数据帧

import pandas as pd


def filter_top_2(row):
    top_2_items = sorted(row, reverse=True)[:2]
    return [
        1
        if x in top_2_items
        else 0
        for x in row
    ]



data = {
    'First':  [1, 2, 3],
    'Second': [2, 1, 5],
    'Third': [5, 1, 2]
}

df = pd.DataFrame(data)
print(df)
print(df.apply(filter_top_2, axis=1, result_type='broadcast'))
输出

   First  Second  Third
0      1       2      5
1      2       1      1
2      3       5      2
   First  Second  Third
0      0       1      1
1      1       1      1
2      1       1      0

您可以创建一个助手函数,用于根据值是否适合top2将其转换为0或1。 然后可以通过
apply
方法将此函数应用于数据帧

import pandas as pd


def filter_top_2(row):
    top_2_items = sorted(row, reverse=True)[:2]
    return [
        1
        if x in top_2_items
        else 0
        for x in row
    ]



data = {
    'First':  [1, 2, 3],
    'Second': [2, 1, 5],
    'Third': [5, 1, 2]
}

df = pd.DataFrame(data)
print(df)
print(df.apply(filter_top_2, axis=1, result_type='broadcast'))
输出

   First  Second  Third
0      1       2      5
1      2       1      1
2      3       5      2
   First  Second  Third
0      0       1      1
1      1       1      1
2      1       1      0

聪明,但我不遵循第二个
argsort
。。。想详细说明一下吗?第三行的输出也不正确,可能只是需要调整一下。Argsort只返回将对数组进行排序的索引位置。要将其转换为rankorder,还需要对这些索引进行argsort。查看此项了解详细信息。谢谢,但我认为您的第一个解决方案不会导致排名。我需要一个能把所有值排成一行的东西。因此,排名前n=1的人0更新了我的答案,使之适用于所有级别。请检查并让我知道这是否有效。很聪明,但我不遵循第二个
argsort
。。。想详细说明一下吗?第三行的输出也不正确,可能只是需要调整一下。Argsort只返回将对数组进行排序的索引位置。要将其转换为rankorder,还需要对这些索引进行argsort。查看此项了解详细信息。谢谢,但我认为您的第一个解决方案不会导致排名。我需要一个能把所有值排成一行的东西。因此,排名前n=1的人0更新了我的答案,使之适用于所有级别。一定要检查并让我知道这是否有效。