Python:通过对象而非字符串进行循环迭代

时间:2018-07-22 00:34:49

标签: python pandas for-loop

我使用pd.GetDummies对我的分类变量进行了一次热编码,以用作预测变量。对于某些具有许多唯一值的列,我有许多新列,我试图找到一种快速的方法来为它们创建交互条件。 (我只希望与我的一部分子集进行交互,所以PolynomialFeatures()无法正常工作...还是可以?)

这就是我想要做的:

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

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循环:

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',由以下证据证明:

for col in cols:
    for i in col:
        print i

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

目标:我希望获得的结果是获得一个名为 的新列,因为这两个列最初是相乘的,并且具有 values 乘法。

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

value_days | channel_A | value_X_channel_A
-------------------------------------------
5          |5          |25

如果我只运行内部循环并将col替换为channel,则效果很好。

如何使它正常工作?

谢谢。

2 个答案:

答案 0 :(得分:1)

哦,我知道,在您的函数中,您基本上是在调用“通道”字符串。但是要遍历通道变量的值,需要先使用vars函数将字符串转换为变量。

示例:

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)

输出:

channel_A
channel_B
quote_A
quote_B

针对您的功能,将其更改为:

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 :(得分:1)

您的问题用措辞难以理解(至少对我而言)。如果我对您的要求是正确的,则希望将名称以“ channel”或“ quote”开头的每一列乘以存储在df中的“ value_days”列,然后将其存储在名为value_X_ { i}其中{i}是相乘的列的名称。您很接近,但是您的代码很尴尬。使用另一个数据结构(字典)使代码简单易读:

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并将它们设置为相应的值,您可以很快意识到代码有问题,但是您实际上从未在您的代码中使用任何一个列表代码。