首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python:循环迭代遍历对象,而不是字符串

Python:循环迭代遍历对象,而不是字符串
EN

Stack Overflow用户
提问于 2018-07-22 08:34:49
回答 2查看 121关注 0票数 1

我使用pd.GetDummies对我的分类变量进行了热编码,以用作预测值。对于我的一些具有许多唯一值的列,我有许多新的列,我正在尝试找到一种快速的方法来为这些列创建交互术语。(我只想让我的列的一个子集进行交互,所以PolynomialFeatures()不会对它进行work...or,对吗?)

这就是我想要做的:

第1步:为要乘的每个子集创建列名列表:

代码语言:javascript
复制
channel = [col for col in df if col.startswith('channel')]
quote = [col for col in df if col.startswith('quote')]

print(channel[:1])
Out: 'channel_A'
     'channel_B'

第2步:for循环:

代码语言:javascript
复制
cols = 'channel quote'.split()
for col in cols:
    for i in col:
        colname = 'value_X_'+i
        df[colname] = df['value_days']*df[i]+0

问题在于,内部循环不会将错误识别为对象:它会将其识别为字符串( col = 'c',表示为:

代码语言:javascript
复制
for col in cols:
    for i in col:
        print i

Out[1]: 
c
h
.
.
.
o
t
e

Goal:我期望的结果是获得一个新列,该列以最初相乘的两列命名,并且具有用于相乘的值。

例如,通道中的第一个元素是channel_A,因此我希望获得一个名为value_X_channel_A的新列,它的值应该等于value_days*channel_A的乘积。

代码语言:javascript
复制
value_days | channel_A | value_X_channel_A
-------------------------------------------
5          |5          |25

如果我只运行内部循环并用channel替换col,就可以很好地工作。

我怎么才能让它工作呢?

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-22 09:24:38

你的问题的表达方式很难理解(至少对我来说是这样)。如果我猜对了您想要什么,那么您希望将名称以"channel“或"quote”开头的每一列与存储在df中的列"value_days“相乘,然后将其存储在名为value_X_{i}的新列中,其中{i}是相乘的列的名称。你已经很接近了,但是你的代码很笨拙。使用另一个数据结构(Dictionary)使代码简单易读:

代码语言:javascript
复制
d = { 
    'quote' : [col for col in df if col.startswith('quote')],
    'channel' : [col for col in df if col.startswith('channel')]
}

for columns_string, columns in d.items():
    for col_string in columns:
        colname = 'value_X_'+col_string
        df[colname] = df['value_days'] * df[i] + 0

解释:

d = ... -创建一个字典,其中包含两个键值对'quote‘和'channel’,它们的值等于所需列名的列表。

for column_string, columns in d.items(): - .items()返回字典键/值对的迭代器,然后循环将每个键命名为'column_string‘,并将列名称列表存储在变量'columns’中。

通过注意您创建了变量channelquote并将它们设置为相应的值,您可以很快意识到代码有问题,但您从未在代码中实际使用过这两个列表。

票数 1
EN

Stack Overflow用户

发布于 2018-07-22 09:14:36

哦,我明白了,在你的函数中,你基本上是在调用'channel‘字符串。但是要循环通过channel变量的值,您需要首先使用vars函数将字符串转换为变量。

示例:

代码语言:javascript
复制
channel=['channel_A','channel_B']
quote=['quote_A','quote_B']

cols = 'channel quote'.split()

for col in cols:
    var=vars()[col]
    for ele in var:
        print(ele)

输出:

代码语言:javascript
复制
channel_A
channel_B
quote_A
quote_B

对于您的函数,将其更改为:

代码语言:javascript
复制
cols = 'channel quote'.split()
for col in cols:
    for i in vars()[col]:
        colname = 'value_X_'+i
        df[colname] = df['value_days']*df[i]+0

如果您仍然不清楚,请随时询问。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51461110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档