【问题标题】:In pandas, how do I flatten a group of rows在熊猫中,我如何展平一组行
【发布时间】:2017-06-09 09:31:48
【问题描述】:

我是 python 中的 pandas 的新手,如果能提供任何帮助,我将不胜感激。我一直在谷歌搜索和谷歌搜索,但似乎无法破解它。

例如,我有一个包含 6 列的 csv 文件。我正在尝试将这些行组合在一起,以便每一行的所有数据都平铺成一行。

如果我的数据如下所示:

event event_date event_time name height age 1 2015-05-06 14:00 J Bloggs 185 24 1 2015-05-06 14:00 P Smith 176 55 1 2015-05-06 14:00 T Kirk 193 22 2 2015-05-14 17:00 B Gates 178 72 2 2015-05-14 17:00 J Mayer 184 42

而我想把它弄平

event  event_date   event_time    name_1     height_1   age_1   name_2     height_2   age_2    name_3    height_3   age_3                                          
1      2015-05-06   14:00         J Bloggs   185        24      P Smith    176        55       T Kirk    193        22                                         
2      2015-05-14   17:00         B Gates    178        72      J Mayer    184        42
                                                                                                                                                                           .           

因此,正如您在上面看到的,前 3 行中的第一个事件已被扁平化为一个,并且列已扩展以容纳行数据。第二个事件已被展平,列中充满了数据。

任何帮助都将得到赞赏。

【问题讨论】:

  • 不确定我是否理解正确,但也许你可以做一个熊猫内部连接?也许使用 pd.merge(df,df,on='event',how=' inner') 并在之后使用 drop_duplicates。

标签: python csv pandas dataframe


【解决方案1】:

你把一张长桌子做成了一张宽桌子。通常在数据分析中你想做相反的事情。这是一种方法,它首先计算每个变量名称、身高和年龄的出现次数,然后按照您想要的方式旋转它们。

df['group_num'] = df.groupby(['event', 'event_date','event_time']).cumcount() + 1
df = df.sort_values('group_num')
df1 = df.set_index(['event', 'event_date','event_time', 'group_num']).stack().reset_index()
df1['var_names'] = df1['level_4'] + '_' + df1['group_num'].astype(str)
df1 = df1.drop(['group_num', 'level_4'], axis=1)
df1.set_index(['event', 'event_date', 'event_time', 'var_names']).squeeze().unstack('var_names')

var_names                   age_1 age_2 age_3 height_1 height_2 height_3  \
event event_date event_time                                                
1     2015-05-06 14:00         24    55    22      185      176      193   
2     2015-05-14 17:00         72    42  None      178      184     None   

var_names                      name_1   name_2  name_3  
event event_date event_time                             
1     2015-05-06 14:00       J Bloggs  P Smith  T Kirk  
2     2015-05-14 17:00        B Gates  J Mayer    None  

【讨论】:

    【解决方案2】:

    步骤:

    1) 计算 Groupby 对象的累积计数。加 1 以便按照所需的 DF 格式化标题。

    2) 将相同的分组列设置为索引轴以及计算的cumcounts,然后设置unstack。另外,根据最低级别对标题进行排序。

    3) 重命名多索引列并相应展平以获得单个标题。


    cc = df.groupby(['event','event_date','event_time']).cumcount() + 1
    df = df.set_index(['event','event_date','event_time', cc]).unstack().sort_index(1, level=1)
    df.columns = ['_'.join(map(str,i)) for i in df.columns]
    df.reset_index()
    

    【讨论】:

    • 小修正,发现 here 的 reset_index() 已就地默认为 false。这意味着您在此处的示例什么也不做。需要 reset_index(inplace=True)。
    猜你喜欢
    • 2015-05-17
    • 2019-08-03
    • 2018-12-01
    • 2021-06-13
    • 2019-01-15
    • 2022-01-24
    • 2022-01-12
    • 2015-12-28
    • 1970-01-01
    相关资源
    最近更新 更多