python:从熊猫中的数据框生成的列表比数据框列长得多

Posted

技术标签:

【中文标题】python:从熊猫中的数据框生成的列表比数据框列长得多【英文标题】:python: list generated from dataframe in pandas is much longer than the dataframe column 【发布时间】:2022-01-04 15:32:54 【问题描述】:

此代码应根据 df['a'] 中的值在“cat”列表中的位置生成一个名为“cat_list”的列表。如果 df['a'] 包含 'cat' 列表中不存在的值,则应将 0 附加到 'cat_list'。 'cat_list' 的长度应该是 6,但我不确定为什么它的长度是 18。

import pandas as pd

d = 'a': [0.1, 0.2,0.3,0.4,0.5,0.6], 'b': [0.6, 0.8,0.3,0.4,0.1,0.1],
     'c': [0.7, 0.3,0.9,0.4,1.0,0.2],'d': [1,0,0,1,0,1]
df = pd.DataFrame(data=d)

cat=[0.6,0.3,0.1]
cat_list=[]
for i in df.a:
    for j in cat:
        if i == j:
            cat_list.append(cat.index(j))
        else:
            cat_list.append(0)

print(cat_list) # should print [2,0,1,0,0,0]
print(len(cat_list)) # should print 6, not 18

【问题讨论】:

在长度方面,你有一个超过 6 个元素的循环超过一个超过 3 个元素的循环。每次运行的内部循环都附加到 cat_list 中,因此它将始终是 18 个元素,除非您更改附加方式 纸笔调试应该说实话 提示:你需要一个显式的 for 循环而不是两个 对不起,如果您的预期结果是 [2,0,1,0,0,0][2,-1,1,-1,-1,0][2,nan,1,nan,nan,0],这是否有意义。如何区分 0(代表 0.1)和 0(代表无)? 【参考方案1】:

对数据帧使用循环通常效率很低。

您可以在“a”列上使用 map 和精心设计的 defaultdict,这将确保在找不到值时映射 0:

from collections import defaultdict
val = defaultdict(lambda :0, zip(cat, range(len(cat))))
df['a'].map(val).tolist()

输出:[2, 0, 1, 0, 0, 0]

或者,您可以使用列表推导和经典字典,使用get 可以在缺少键时设置默认值:

val = dict(zip(cat, range(len(cat))))
[val.get(e, 0) for e in df['a'].values]

使用的字典/默认字典的格式:

>>> val
0.6: 0, 0.3: 1, 0.1: 2

【讨论】:

【参考方案2】:

在长度方面,您在一个超过 6 个元素的循环内有一个超过 3 个元素的循环。这将产生 6*3=18 个元素。

每次运行的内部循环都附加到 cat_list 中,而不是仅在找到该项目时或未找到时一次。 我相信这就是你想要做的:

import pandas as pd

d = 'a': [0.1, 0.2,0.3,0.4,0.5,0.6], 'b': [0.6, 0.8,0.3,0.4,0.1,0.1],
     'c': [0.7, 0.3,0.9,0.4,1.0,0.2],'d': [1,0,0,1,0,1]
df = pd.DataFrame(data=d)

cat=[0.6,0.3,0.1]
cat_list=[]
for i in df.a:
    found_in_cat=False
    for j in cat:
        if i == j:
            cat_list.append(cat.index(j))
     if not found_in_cat:
        cat_list.append(0)

print(cat_list) # should print [2,0,1,0,0,0]
print(len(cat_list)) # should print 6, not 18

不过,我会这样写:

import pandas as pd

d = 'a': [0.1, 0.2,0.3,0.4,0.5,0.6], 'b': [0.6, 0.8,0.3,0.4,0.1,0.1],
     'c': [0.7, 0.3,0.9,0.4,1.0,0.2],'d': [1,0,0,1,0,1]
df = pd.DataFrame(data=d)

cat=[0.6,0.3,0.1]
cat_list=[]
for i in df.a:
    if i in cat:
        cat_list.append(cat.index(i))
    else:
        cat_list.append(0)

print(cat_list) # should print [2,0,1,0,0,0]
print(len(cat_list)) # should print 6, not 18

【讨论】:

没有解释的回答往往一文不值 @athing 那么你认为我需要什么“解释” @jhylands 让我纠正他对你的投票~ 当我开始学习时你根本没有解释,调试是程序员的一项重要技能,这就是我试图对提问者说的话。你还是不解释你写的代码 @BENY 不确定您的意思是您在此处某处得到了答案,但我认为声誉不够

以上是关于python:从熊猫中的数据框生成的列表比数据框列长得多的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中迭代列表和添加熊猫数据框列非常慢

熊猫将数据框列单元格初始化为空列表

熊猫数据框列和行中的拆分列表

数据框列数据 - 熊猫 - python

熊猫数据框列上的子字符串

熊猫数据框列中的成员资格测试