【问题标题】:How do I use apply to quickly determine which column a rows features apply to?如何使用 apply 快速确定行功能适用于哪一列?
【发布时间】:2020-01-22 19:46:42
【问题描述】:

我有一个 obj eps,它是一个 list,在该对象中有一堆列名:[col1, col2, col3, ...]。我还有一个 DataFrame,其中有一列名为 features。在该列中,您将找到包含数字的list[1,4,5,13,17,20, ...]。我想要做的是使用apply() 方法来确定行值关联到哪一列(在eps 中)。所以,row['features'] = [1,3,4,6]; eps[1] = col2。因此col2 = True,否则如果features中的数字与eps中的任何列都没有关联,col_n = False

有没有一种简单的方法可以使用 pandas 的 apply 方法来做到这一点?

这是一些伪代码:

feats= []
for row in df["features"]:
    for i in range(len(eps)):
        if i in row:
            feats.append(True)
        else:
            feats.append(False)

这可行,但速度很慢,我知道.apply() 会大大加快速度。我已经切换到.iterrows(),但仍然不够好。请帮忙!

df['features'] 中的前 4 个元素可能是:

[1,4,6,12,45,67]
[3,6,7,8,10,39,57,64,65]
[2,9,10,11,57,58,60,71,75]
[1,4,10,76,584]

【问题讨论】:

  • 你读过熊猫文档吗?你能分享一个你的数据示例吗,minimal reproducible example?任务的描述可能还需要一些工作,我不完全确定我理解它。
  • 为了更清楚,我编辑了这个问题。希望它有所帮助。

标签: python-3.x pandas apply


【解决方案1】:

features 是一系列列表,所以我认为你无法避免循环。尝试列表理解,看看它是否有助于提高速度

eps_tfs = {col:[] for col in eps}
features = [i in l  for l in df['features'] for i in range(len(eps))]
n = 0
for b in features:
    if b == True:
        try:
            eps_tfs[eps[n]].append(True)
        except:
            n = 0
            eps_tfs[eps[n]].append(True)
    else:
        try:
            eps_tfs[eps[n]].append(False)
        except:
            n = 0
            eps_tfs[eps[n]].append(False)
    n += 1

df = pd.concat([df, pd.DataFrame(eps_tfs)], axis=1)

Out[1007]:
[False,
 True,
 False,
 False,
 True,
 False,
 True,
 False,
 False,
 False,
 False,
 False,
 True,
 False,
 False,
 False,
 False,
 False,
 False,
 False,
 False,
 False,
 True,
 False,
 False,
 True,
 True,
 True,
 False,
 True,
 False,
 False,
 False,
 False,
 False,
 False,
 False,
 False,
 False,
 False,
 True,
 False,
 False,
 False,
 False,
 False,
 False,
 True,
 True,
 True,
 False,
 False,
 False,
 False,
 False,
 False,
 False,
 False,
 True,
 False,
 False,
 True,
 False,
 False,
 False,
 False,
 False,
 True,
 False,
 False,
 False,
 False,
 False,
 False,
 False,
 False]

注意:我的样本 eps 的长度为 19,所以我的输出长度为 76,因为 4 行 df.features 乘以 19 得到列表 feat 的 76 个元素

【讨论】:

  • 为什么是feat[df['features']] = 1,后面是feat.astype(bool)?不只是feat[df['features']] = True 工作吗?
  • @AMC:我使用np.zeros,因此分配True 将被强制转换为1 到数组。
  • 这不会很快地用于大型系列。我仍然需要使用 for 循环。请了解如何使用申请。我现在正试图弄清楚。
  • 我可能是错的。等一下,由于feat 的大小,我的服务器正在崩溃。
  • IndexError: only integers, slices (:), ellipsis (...), numpy.newaxis (None) and integer or boolean arrays are valid indices
猜你喜欢
  • 2018-04-12
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
相关资源
最近更新 更多