在pandas中,如何展平一组行

时间:2017-01-24 14:25:57

标签: python csv pandas dataframe

我是python中的熊猫新手,我将不胜感激为此提供任何帮助。我一直在谷歌搜索和谷歌搜索,但似乎无法解决它。

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

因此,如果我的数据如下:

IO

以及我最终想要以它为平面的东西

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

因此,正如您可以看到的那样,前3行中的第一个事件已被展平为一个,并且扩展了列以容纳行数据。第二个事件已被夷为平地,列中充满了数据。

任何帮助都会被贬低。

2 个答案:

答案 0 :(得分:8)

<强> 步骤:

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

enter image description here

答案 1 :(得分:2)

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

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