提问人:trojan horse 提问时间:8/2/2022 更新时间:8/2/2022 访问量:223
将列表中的选定项除以 DataFrame 中的另一列,然后选择排名靠前的结果
Divide a selected item of a list by another column in a DataFrame and chose top results
问:
我有以下测试 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]] |
答:
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']]
评论