我有一个数据框,分为数字和列表范围,对应于这些范围。我想遍历每一列,并获得最大数量,并根据范围将列的标题放在右侧列表中。我有的列表和数据框是:
range A B C
0 0-300 20 0 427
1 300-500 66 16 341
2 500-800 164 82 368
3 >800 1245 1397 328
low_group = [] # 0-300
mid1_group = [] # 300-500
mid2_group = [] # 500-800
high_group - [] # >800
列表输出应该如下所示:
low_group = ['C']
mid1_group = []
mid2_group = []
high_group - ['A','B']
谁知道我怎么能做到这一点?
您可以将range
系列设置为索引并使用idxmax
:
res = df.set_index('range').idxmax()
print(res)
A >800
B >800
C 0-300
dtype: object
更接近您所需的格式,您可以使用字典映射范围列出:
d = res.reset_index().groupby(0)['index'].apply(list).to_dict()
print(d)
{'0-300': ['C'], '>800': ['A', 'B']}
然后,您可以根据需要重命名密钥。在我看来,避免使用可变数量的变量是一种好习惯。字典通常就足够了。
我通常不会使用任意命名变量来存储值。您可以存储它可哈希的getter对象。
In [281]: mapper = {'0-300': 'low', '301-500': 'mid1', '501-800': 'mid2', '>800': 'high'}
In [282]: df.set_index('range').idxmax().map(mapper)
Out[282]:
A high
B high
C low
dtype: object
使用melt
df.melt('range').sort_values('value').drop_duplicates('variable',keep='last')
Out[487]:
range variable value
8 0-300 C 427
3 >800 A 1245
7 >800 B 1397