为什么这个函数不被应用到熊猫数据框架?



我正在处理一个非常大的Pandas DataFrame,并希望对其属性进行一次性编码。每行拥有与每个属性对应的10列。属性列在"attributes"列中,我想遍历该列,然后针对各个列。最后,每一行拥有的属性应该是15,没有的属性应该是0。对于较小的DataFrame,此函数可以工作:

for i in range(len(df)):
attributes = df.loc[i, 'attributes'].split(',')
for item in attributes:
df.loc[i, item] = 1

现在我正在处理更大的数据集,我的Jupyter Notebook的内核死亡/当我尝试这样做时需要永远。我已经尝试实现一个apply()方法,但是当我再次检查数据框时,内核再次死亡,或者它似乎正在进行的更改(添加"1 ")不会持续存在。我会在下面列出我一直在尝试的选项,如果这里有什么问题,请让我知道,或者如果Jupyter Notebook不是处理大量数据的正确地方,我也将非常感谢关于这一点的建议。

尝试1

def encode_ones(row):
attr = row.attributes.split(',')
row.loc[attr] = 1
df.apply(lambda row: encode_ones(row), axis=1)

尝试2

def make_one(cell): 
if cell == 0:
return 1
df.apply(lambda row: make_one(row.loc[row.attributes]), axis=1)

尝试3

def change_to_one(row):
row.loc[[row.attributes]] = 1
df.apply(change_to_one, axis=1)

我知道关于Pandas中的视图/副本和链式操作的混淆是常见的,这就是为什么我使用。loc,但是我在这里偏离了标记吗?

我正在处理一个非常大的Pandas DataFrame,并希望对其"属性"进行一次性编码。

尝试在attributes列上使用str.get_dummies方法,看看它是否在大型数据集上表现更好。

链接到pandas文档

import pandas as pd
df = pd.DataFrame({'attributes': ['a, b, c', 'a, c']})
one_hot = df['attributes'].str.get_dummies(sep=', ')
# Add one-hot encoding columns to the original data frame
df = df.join(one_hot)

这是结果数据帧。

attributes  a  b  c
0    a, b, c  1  1  1
1       a, c  1  0  1

看起来你的功能encode_ones应该工作。您是否看到内存不足错误?

相关内容

  • 没有找到相关文章

最新更新