我使用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
,则效果很好。
如何使它正常工作?
谢谢。
答案 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”中
通过注意到您创建了变量channel
和quote
并将它们设置为相应的值,您可以很快意识到代码有问题,但是您实际上从未在您的代码中使用任何一个列表代码。