【问题标题】:Flatten a Pandas DataFrame展平熊猫数据框
【发布时间】:2015-09-15 06:15:13
【问题描述】:

我有一个看起来像这样的 Pandas DataFrame(目前除了内置的行索引之外没有索引,但如果更容易将索引添加到“Person”和“Car”,那也可以):

before = pd.DataFrame({
  'Email': ['john@example.com','mary@example.com','jane@example.com','john@example.com','mary@example.com'],
  'Person': ['John','Mary','Jane','John','Mary'],
  'Car': ['Ford','Toyota','Nissan','Nissan','Ford']
})

我想把它重新塑造成这样:

after = pd.DataFrame({
  'Person': ['John','Mary','Jane'],
  'Email': ['john@example.com','mary@example.com','jane@example.com'],
  'Ford': [True,True,False],
  'Nissan': [True,False,True],
  'Toyota': [False,True,False]
})

请注意,约翰拥有一辆福特和一辆日产,玛丽拥有一辆福特和一辆丰田,而保罗则坚持使用他值得信赖的日产。

我已经尝试了堆叠多索引 DataFrame、分组、旋转的各种排列——我似乎无法弄清楚如何从“Car”列中获取值并将其转置到一个新列中值“True”,通过他们的名字将人们合并在一起。

【问题讨论】:

    标签: python pandas pivot dataframe pivot-table


    【解决方案1】:

    不确定这是否是最好的方法,但一种方法是 -

    In [26]: before.pivot_table(index=['Email','Person'],columns=['Car'], aggfunc=lambda x: True).fillna(False).reset_index()
    Out[26]:
    Car             Email Person   Ford Nissan Toyota
    0    jane@example.com   Jane  False   True  False
    1    john@example.com   John   True   True  False
    2    mary@example.com   Mary   True  False   True
    

    【讨论】:

    • 接受这一点是因为我对优雅的单衬纸着迷,而且没有一次性色谱柱。感谢您及时的回复。 :)
    【解决方案2】:
    before['has_car'] = True
    
    Out[93]:
    car                Email    Person  has_car
    Ford    john@example.com    John    True
    Toyota  mary@example.com    Mary    True
    Nissan  jane@example.com    Jane    True
    Nissan  john@example.com    John    True
    Ford    mary@example.com    Mary    True
    
    df = before.pivot_table(index = ['Person' , 'Email'], columns= 'Car' , values='has_car')
    
    
    Out[89]:
                                Ford    Nissan  Toyota
    Person  Email           
    Jane    jane@example.com    NaN     True    NaN
    John    john@example.com    True    True    NaN
    Mary    mary@example.com    True    NaN     True
    
    df.fillna(False).reset_index()
    
    Out[102]:
    Car Person  Email               Ford    Nissan  Toyota
    0   Jane    jane@example.com    False   True    False
    1   John    john@example.com    True    True    False
    2   Mary    mary@example.com    True    False   True
    

    【讨论】:

    • 这一步一步来帮助理解,谢谢!