将Pandas groupby转换为具有带有布尔值列的数据框

时间:2019-12-07 09:58:44

标签: python pandas dataframe pandas-groupby multi-index

我的输入数据是-

    "Name" : ["Alice", "Bob", "Jake", "Jake", "Steve" , "Bob"] , 
    "City" : ["Seattle", "Seattle", "Portland", "Seattle", "Seattle", "Portland"],
    "CityID" : ["1", "1", "2", "1", "1", "2"]
 } ) 

打印时显示为:

   City         Name  CityID
0   Seattle    Alice       1
1   Seattle      Bob       1
2  Portland     Jake       2 
3   Seattle     Jake       1
4   Seattle    Steve       1
5  Portland      Bob       2

我正在尝试得到这样的东西-

       City CityID  Alice   Bob  Jake  Steve
0   Seattle      1   True  True  True   True
1  Portland      2  False  True  True  False

我不确定如何到达这里。 我确实尝试过groupby函数

df.groupby(['City','CityID', 'Name']).first()

这使我明白了这一点-

    City    CityID     Name
 Seattle         1    Alice
                        Bob
                       Jake   
Portland         2      Bob
                       Jake
                      Steve    

我不确定此后如何进行,任何提示都会有很大帮助。

1 个答案:

答案 0 :(得分:1)

get_dummiesdtype=bool参数一起使用,MultiIndexmax中具有唯一值:

df = (pd.get_dummies(df.set_index(['City','CityID'])['Name'], dtype=bool)
        .max(level=[0,1])
        .reset_index())
print (df)
       City CityID  Alice   Bob  Jake  Steve
0   Seattle      1   True  True  True   True
1  Portland      2  False  True  True  False

如果需要groupby解决方案,请创建新列,并用DataFrame.assignTrue填充,使用GroupBy.first,用Series.unstack整形,最后转换MultiIndexDataFrame.reset_index的列中,DataFrame.rename_axis用于删除列名a

df = (df.assign(a=True)
        .groupby(['City','CityID', 'Name'], sort=False)['a']
        .first()
        .unstack(fill_value=False)
        .reset_index()
        .rename_axis(None, axis=1))
print (df)
       City CityID  Alice   Bob  Jake  Steve
0   Seattle      1   True  True  True   True
1  Portland      2  False  True  True  False