如何合并在熊猫中共享相同索引值的列?

时间:2021-04-26 23:21:03

标签: python pandas dataframe merge

我试图将在特定电影中工作的所有人员作为数值而不是分类值,但是当我在此数据集上使用一种热编码器的形式时:

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)]

2 个答案:

答案 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