迭代python中的列并根据条件插入列名

问题描述 投票:0回答:3

我有一个数据框,分为数字和列表范围,对应于这些范围。我想遍历每一列,并获得最大数量,并根据范围将列的标题放在右侧列表中。我有的列表和数据框是:

       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']

谁知道我怎么能做到这一点?

python python-3.x pandas
3个回答
4
投票

您可以将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']}

然后,您可以根据需要重命名密钥。在我看来,避免使用可变数量的变量是一种好习惯。字典通常就足够了。


1
投票

我通常不会使用任意命名变量来存储值。您可以存储它可哈希的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

1
投票

使用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
© www.soinside.com 2019 - 2024. All rights reserved.