Python pandas - 提取多值属性
Python pandas - extracting multi-value attributes
我刚开始使用 Python,想用 Movielens 数据集上的 numpy/pandas 包做数据准备(尤其是带有 MovieID、电影名称和年份以及流派的文件)。
截图:movielens - movie dataset
流派列是一个多值列,这对我来说是个问题,因为我想尝试在数据集上使用机器学习算法。
目标: 我想获得 yes/no 或 0/1 的信息,了解电影属于哪种类型,不属于哪种类型。
思路:检查'Genre'列是否包含追加列的列名(单一流派名称)。如果是,写是,否则在单元格中写现在。这将遍历所有新列和所有行。
到目前为止完成: 我将 empty/NaN 列附加到每个流派的数据框中。而且我还尝试了 dataframe.iloc['Genre'].str.contains(list(dataframe)[4])
如果名称匹配或不匹配,它会给我结果 TRUE 或 FALSE。但是如何优雅地在单元格中迭代和写入呢?
非常感谢。
最好,
马塞尔
编辑:在这里你会发现我到目前为止所取得的成就。我使用管道分隔符拆分流派列中的数据,重命名列并附加新列并删除旧列。如果我现在在所有列上使用 get_dummies
函数,它会创建例如a 'Genre1_Action', 'Genre1_Adventure', ..., 'Genre3Thriller',根据 Genre 单元格的单元格中显示的文本值。
我想要实现的是,每个流派都会为每部电影获得其单独的列。
# create a small test subset
subset1 = movie_data [0:9]
print("Original Dataset")
print(subset1)
# Split movie year and year in separate values -> append them to the df -> clean the Year column
tempY = subset1['MovieNameYear'].str.split('(').apply(pd.Series)
tempY.columns = ['MovieName','Year']
subset1 = pd.concat([subset1,tempY], axis=1, join='inner')
subset1['Year'] = subset1['Year'].str.replace(')','')
del subset1['MovieNameYear']
# split the column 'Genre' with the with the pipe separator in seperate columns
# name the columns of the temp value with the splitted values
# join the through split created columns to the existing subset and delete the original multi value column
tempG = subset1['Genre'].str.split('|').apply(pd.Series)
tempG.columns = ['Genre1','Genre2','Genre3']
subset1 = pd.concat([subset1, tempG], axis=1, join='inner')
del subset1['Genre']
print("Cleaned Dataset")
print(subset1)
dummiesTemp = pd.get_dummies(data=subset1, columns=['Genre1','Genre2','Genre3'])
print(dummiesTemp)
如果我理解你的话,你希望每个流派都有一列,表示 T/F。我建议您查看 get_dummies 函数
import pandas as pd
s = pd.Series(list('abca'))
pd.get_dummies(s)
更新 - 如果您的列具有双精度值,您可以在它们之前或之后拆分它们。分裂后的例子(猜测它是最快的,但应该测试)。代码可以更漂亮,但希望它清晰。
import pandas as pd
import numpy as np
s = pd.Series(['a', 'b', 'c', 'a|b', 'a|d'])
d = pd.get_dummies(s)
columns = list(d)
for col in columns:
if '|' in col:
for l in col.split('|'):
if l in columns:
d[l] = np.maximum(d[l].values, d[col].values)
else:
d[l] = d[col]
这实际上应该是一条评论,但缺乏声誉:')。 我得到了一个不错的答案。
简而言之
dummies = df.genres.str.get_dummies('|')
这将为您提供一个包含 one-hot 编码 输出的 DataFrame。
然后您可以通过 :
将此加入原来的 df
df = df.join(dummies)
我刚开始使用 Python,想用 Movielens 数据集上的 numpy/pandas 包做数据准备(尤其是带有 MovieID、电影名称和年份以及流派的文件)。
截图:movielens - movie dataset
流派列是一个多值列,这对我来说是个问题,因为我想尝试在数据集上使用机器学习算法。
目标: 我想获得 yes/no 或 0/1 的信息,了解电影属于哪种类型,不属于哪种类型。
思路:检查'Genre'列是否包含追加列的列名(单一流派名称)。如果是,写是,否则在单元格中写现在。这将遍历所有新列和所有行。
到目前为止完成: 我将 empty/NaN 列附加到每个流派的数据框中。而且我还尝试了 dataframe.iloc['Genre'].str.contains(list(dataframe)[4])
如果名称匹配或不匹配,它会给我结果 TRUE 或 FALSE。但是如何优雅地在单元格中迭代和写入呢?
非常感谢。 最好, 马塞尔
编辑:在这里你会发现我到目前为止所取得的成就。我使用管道分隔符拆分流派列中的数据,重命名列并附加新列并删除旧列。如果我现在在所有列上使用 get_dummies
函数,它会创建例如a 'Genre1_Action', 'Genre1_Adventure', ..., 'Genre3Thriller',根据 Genre 单元格的单元格中显示的文本值。
我想要实现的是,每个流派都会为每部电影获得其单独的列。
# create a small test subset
subset1 = movie_data [0:9]
print("Original Dataset")
print(subset1)
# Split movie year and year in separate values -> append them to the df -> clean the Year column
tempY = subset1['MovieNameYear'].str.split('(').apply(pd.Series)
tempY.columns = ['MovieName','Year']
subset1 = pd.concat([subset1,tempY], axis=1, join='inner')
subset1['Year'] = subset1['Year'].str.replace(')','')
del subset1['MovieNameYear']
# split the column 'Genre' with the with the pipe separator in seperate columns
# name the columns of the temp value with the splitted values
# join the through split created columns to the existing subset and delete the original multi value column
tempG = subset1['Genre'].str.split('|').apply(pd.Series)
tempG.columns = ['Genre1','Genre2','Genre3']
subset1 = pd.concat([subset1, tempG], axis=1, join='inner')
del subset1['Genre']
print("Cleaned Dataset")
print(subset1)
dummiesTemp = pd.get_dummies(data=subset1, columns=['Genre1','Genre2','Genre3'])
print(dummiesTemp)
如果我理解你的话,你希望每个流派都有一列,表示 T/F。我建议您查看 get_dummies 函数
import pandas as pd
s = pd.Series(list('abca'))
pd.get_dummies(s)
更新 - 如果您的列具有双精度值,您可以在它们之前或之后拆分它们。分裂后的例子(猜测它是最快的,但应该测试)。代码可以更漂亮,但希望它清晰。
import pandas as pd
import numpy as np
s = pd.Series(['a', 'b', 'c', 'a|b', 'a|d'])
d = pd.get_dummies(s)
columns = list(d)
for col in columns:
if '|' in col:
for l in col.split('|'):
if l in columns:
d[l] = np.maximum(d[l].values, d[col].values)
else:
d[l] = d[col]
这实际上应该是一条评论,但缺乏声誉:')。
简而言之
dummies = df.genres.str.get_dummies('|')
这将为您提供一个包含 one-hot 编码 输出的 DataFrame。
然后您可以通过 :
将此加入原来的 dfdf = df.join(dummies)