繁体   English   中英

python:从 pandas 中的 dataframe 生成的列表比 Z6A8064B5DF47945550057 列3C4 长得多

[英]python: list generated from dataframe in pandas is much longer than the dataframe column

此代码应根据“cat”列表中的 position 生成一个名为“cat_list”的列表,该列表取自 df['a'] 的值。 如果 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 个元素的循环。 这将产生 6*3=18 个元素。

每次运行内部循环时,您都会将 append 转移到 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

对数据帧使用循环通常是低效的。

您可以在“a”列上使用map和精心制作的defaultdict ,这将确保 map 0 当找不到该值时:

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

output: [2, 0, 1, 0, 0, 0]

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

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}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM