【问题标题】:Python: for loop iteration through objects, not stringsPython:for循环迭代对象,而不是字符串
【发布时间】:2018-07-22 10:36:00
【问题描述】:

我使用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'

第二步: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

目标:我想要的结果是获得一个新列,named 两列最初相乘,并具有 values乘法。

例如,channel中的第一个元素是channel_A,所以我想得到一个名为value_X_channel_A的新列,它的值应该等于value_days*channel_A的乘积。

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

如果我只运行内部循环并将col 替换为channel,这将非常有效。

我怎样才能让它工作?

提前致谢。

【问题讨论】:

  • 字符串是对象......并且您在字符串(即通道、引号)中迭代字符(即 c、h、a、n),您希望得到什么?
  • 感谢您澄清@Marcus.Aurelianus。我编辑了这个问题来回答这个问题。
  • delete line 'for i in col:' ,然后试试?
  • 感谢您的建议,但这并没有得到每列的唯一名称。那只会给我channel,但实际的列名是channel_Achannel_B,等等。这就是内部循环的原因:我需要遍历以'channel' 开头的列名列表。
  • 好的,你很难使用 for 循环吗?您不能将处理放在一个函数中并将其应用于数据帧吗?

标签: python pandas for-loop


【解决方案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' 并且 column-names-list 存储在变量 'columns' 中。

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

【讨论】:

  • 是的,我的问题措辞不佳反映了我对编码的适应程度。我需要更好地使用字典,这是一个很好的例子,说明它们是多么有用。感谢您花时间解释这一点!
  • @NLR 很高兴我能提供帮助。字典是 Python 中的生计,它们非常灵活,可用于解决无数问题。
【解决方案2】:

哦,我明白了,在您的函数中,您基本上是在调用“通道”字符串。但是要从通道变量中循环值,您需要先使用 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

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

【讨论】:

  • 我觉得如果没有必要以这种方式访问​​变量是不好的做法。我可能是错的,但这似乎是一种尴尬的方式。
  • @YungGun,基本上就是OP使用的数据结构。
  • 我不确定你的意思@Marcus.Aurelianus
  • @YungGun,他倾向于用一个变量来表示所有以那个名字开头的字符串,channel = [col for col in df if col.startswith('channel')] quote = [col for col in df if col.startswith('quote')]
  • @Marcus.Aurelianus:感谢您抽出宝贵时间回答这个问题。即使使用vars() 并不理想,但我了解到这个函数是存在的,这本身就是一个很大的帮助。
猜你喜欢
  • 2017-11-05
  • 2018-02-27
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
相关资源
最近更新 更多