我正在处理一个非常大的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
应该工作。您是否看到内存不足错误?