将列表中的选定项除以 DataFrame 中的另一列,然后选择排名靠前的结果

Divide a selected item of a list by another column in a DataFrame and chose top results

提问人:trojan horse 提问时间:8/2/2022 更新时间:8/2/2022 访问量:223

问:

我有以下测试 DateFrame:

标记 列表 计数
冰淇淋 [['A',0.9],['B',0.6],['C',0.5],['D',0.3],['E',0.1]] 5
土豆 [['U',0.8],['V',0.7],['W',0.4],['X',0.3],['Y',0.2]] 5

Count 基本上是 DataFrame 中能够获取并添加为新列的列表数。我想将列表中元素的分数除以“计数”列中的值。结果应该是这样的:

标记 列表 计数
冰淇淋 [['A',0.18],['B',0.12],['C',0.1],['D',0.06],['E',0.02]] 5
土豆 [['U',0.16],['V',0.14],['W',0.08],['X',0.06],['Y',0.04]] 5

我怎样才能只将列表中的第二个元素与计数值分开。

我知道如果将列表列除以计数列,它将不起作用,因为其中一个元素是字符串。

data = [['icecream', [['A', 0.9],['B', 0.6],['C',0.5],['D',0.3],['E',0.1]]], 
        ['potato', [['U', 0.8],['V', 0.7],['W',0.4],['X',0.3],['Y',0.2]]]]

test = pd.DataFrame(data, columns=['tag', 'list'])
test['Count'] = test['list'].str.len().sort_values( ascending=[False])
test

test['list'].div(test['Count'])

gives an error which is expected: 
TypeError: unsupported operand type(s) for /: 'list' and 'int'

在下一步中,我只想包括其值在成员的前 10 个百分位数的列表。比方说,它是这样的:

标记 列表
冰淇淋 [['A',0.18],['B',0.12],['C',0.1]]
土豆 [['U',0.16],['V',0.14]]
Python Pandas 列表 帧数据 操作

评论


答:

1赞 mozway 8/2/2022 #1

Pandas 无法以向量方式处理列表。你在这里别无选择,只能循环。最快的是列表理解:

test['list'] = [[[a, b/len(l)] for a,b in l]
                for l in test['list']]

或者,对于就地修改,一个简单的经典循环:

for l in test['list']:
    for x in l:
        x[1] /= len(l)

铌。您不需要“计数”列。

输出:

        tag                                               list
0  icecream  [[A, 0.18], [B, 0.12], [C, 0.1], [D, 0.06], [E...
1    potato  [[U, 0.16], [V, 0.14], [W, 0.08], [X, 0.06], [...

评论

0赞 trojan horse 8/2/2022
谢谢,@mozway。这确实让我得到了第 1 部分所需的东西。您知道如何进入第二个值,即小数点分数,而只保留 1 个百分位数的值吗?
0赞 mozway 8/2/2022
你如何计算百分位数?您的意思是您想要介于 0.1 和 0.2 之间的值吗?
0赞 trojan horse 8/2/2022
我列出了所有分数,并在那里选择最高百分位数。import numpy as np a = np.array([1,2,3,4,5]) ;p = np.percentile(a, 50) -- 这将返回 3,因为第 50 个百分位数是中位数,这里是 3。同样,我现在可以获取列表中分数的第 50 个百分位数,然后只返回大于或等于第 50 个百分位数的列表元素和分数。列表中的值在列表中已经按降序排列,因此我们不需要排列
0赞 trojan horse 8/3/2022
我可以只过滤列表列以包含分数大于 0.10 的数据吗?这样我就有一个阈值可以测试,并且我不考虑具有非常小值的元素。
0赞 mozway 8/3/2022
是的:[[[a, b/len(l)] for a,b in l if b>=0.1] for l in test['list']]