查找数据帧(Python)行中的前n个值
我想在数据帧的一行中找到前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 我想遍历每一行并选择前
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更新了我的答案,使之适用于所有级别。一定要检查并让我知道这是否有效。