我试图将在特定电影中工作的所有人员作为数值而不是分类值,但是当我在此数据集上使用一种热编码器的形式时:
titleId,nconst,category,characters
tt0035423,nm0000212,actress,"[""Kate McKay""]"
tt0035423,nm0413168,actor,"[""Leopold""]"
tt0035423,nm0000630,actor,"[""Stuart Besser""]"
tt0035423,nm0005227,actor,"[""Charlie McKay""]"
tt0035423,nm0003506,director,\N
我明白了:
x0_nm0000212 x0_nm0000630 x0_nm0003506 x0_nm0005227 x0_nm0413168
titleId
tt0035423 1.0 0.0 0.0 0.0 0.0
tt0035423 0.0 0.0 0.0 0.0 1.0
tt0035423 0.0 1.0 0.0 0.0 0.0
tt0035423 0.0 0.0 0.0 1.0 0.0
tt0035423 0.0 0.0 1.0 0.0 0.0
我怎样才能将 titleId 列中的行组合起来,并且只取 1.0 像这样:
x0_nm0000212 x0_nm0000630 x0_nm0003506 x0_nm0005227 x0_nm0413168
titleId
tt0035423 1.0 1.0 1.0 1.0 1.0
我想过在同一个 titleId 上添加列值的方法,但我找不到方法。
这是代码:
count = principals_data.head().nconst.value_counts()
principals_data = principals_data[
principals_data.nconst.isin(count.index)]
答案 0 :(得分:2)
似乎当前 titleId 是您要应用 groupby 的索引。
一种选择是将“titleId”重置为列并获取每列的最大值。
df.reset_index().groupby('titleId').max()
输出
x0_nm0000212 x0_nm0000630 x0_nm0003506 x0_nm0005227 x0_nm0413168
titleId
tt0035423 1.0 1.0 1.0 1.0 1.0
答案 1 :(得分:1)
crosstab 可用于直接从源 df 生成。
import pandas as pd
df = pd.DataFrame({'titleId': {0: 'tt0035423', 1: 'tt0035423',
2: 'tt0035423', 3: 'tt0035423',
4: 'tt0035423'},
'nconst': {0: 'nm0000212', 1: 'nm0413168',
2: 'nm0000630', 3: 'nm0005227',
4: 'nm0003506'},
'category': {0: 'actress', 1: 'actor',
2: 'actor', 3: 'actor',
4: 'director'},
'characters': {0: '["Kate McKay"]', 1: '["Leopold"]',
2: '["Stuart Besser"]', 3: '["Charlie McKay"]',
4: '\\N'}})
new_df = (
pd.crosstab(df['titleId'], df['nconst'])
.rename_axis(None, axis=1)
.add_prefix('x0_') # Add x0_ prefix to columns
.astype(float) # Convert to Float
)
# For Display
print(new_df)
输出:
x0_nm0000212 x0_nm0000630 x0_nm0003506 x0_nm0005227 x0_nm0413168
titleId
tt0035423 1.0 1.0 1.0 1.0 1.0