我使用pd.GetDummies
对我的分类变量进行了热编码,以用作预测值。对于我的一些具有许多唯一值的列,我有许多新的列,我正在尝试找到一种快速的方法来为这些列创建交互术语。(我只想让我的列的一个子集进行交互,所以PolynomialFeatures()
不会对它进行work...or,对吗?)
这就是我想要做的:
第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
Goal:我期望的结果是获得一个新列,该列以最初相乘的两列命名,并且具有用于相乘的值。
例如,通道中的第一个元素是channel_A
,因此我希望获得一个名为value_X_channel_A
的新列,它的值应该等于value_days
*channel_A
的乘积。
value_days | channel_A | value_X_channel_A
-------------------------------------------
5 |5 |25
如果我只运行内部循环并用channel
替换col
,就可以很好地工作。
我怎么才能让它工作呢?
提前谢谢。
发布于 2018-07-22 09:24:38
你的问题的表达方式很难理解(至少对我来说是这样)。如果我猜对了您想要什么,那么您希望将名称以"channel“或"quote”开头的每一列与存储在df中的列"value_days“相乘,然后将其存储在名为value_X_{i}的新列中,其中{i}是相乘的列的名称。你已经很接近了,但是你的代码很笨拙。使用另一个数据结构(Dictionary)使代码简单易读:
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
并将它们设置为相应的值,您可以很快意识到代码有问题,但您从未在代码中实际使用过这两个列表。
发布于 2018-07-22 09:14:36
哦,我明白了,在你的函数中,你基本上是在调用'channel‘字符串。但是要循环通过channel变量的值,您需要首先使用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
如果您仍然不清楚,请随时询问。
https://stackoverflow.com/questions/51461110
复制相似问题