将DataFrame列中的值转换为列标签

时间:2016-05-02 12:20:39

标签: pandas dataframe pivot

我的数据框如下所示:

Date    Time    Sensors Status
123 4/3/2008    24:08.1 M024    1
125 4/3/2008    24:11.8 M024    1
127 4/3/2008    24:13.6 M025    1
129 4/3/2008    24:14.0 M024    1

我希望我的数据框看起来像:

Date    Time              M024 M025 
123 4/3/2008    24:08.1    1
125 4/3/2008    24:11.8    1
127 4/3/2008    24:13.6         1
129 4/3/2008    24:14.0    

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:1)

我认为您需要pivot_table rename_axispandas 0.18.0中的新内容)和reset_index

print df

         Date     Time Sensor  Status
123  4/3/2008  24:08.1   M024       1
125  4/3/2008  24:11.8   M024       1
127  4/3/2008  24:13.6   M025       1
129  4/3/2008  24:14.0   M024       1


print df.pivot_table(index=['Date','Time'], columns='Sensor', values='Status', fill_value='')
        .rename_axis(None, axis=1)
        .reset_index()

       Date     Time M024 M025
0  4/3/2008  24:08.1    1     
1  4/3/2008  24:11.8    1     
2  4/3/2008  24:13.6         1
3  4/3/2008  24:14.0    1     

编辑:

我认为您需要将列Status转换为intfloat,因为它似乎不是数字(虽然看起来像数字):

df['Status'] = df['Status'].astype(int)

df['Status'] = df['Status'].astype(float)

如果值重复,则由参数aggfunc中的函数进行聚合。默认函数为np.mean

print df
         Date     Time Sensor  Status
123  4/3/2008  24:08.1   M024       2
123  4/3/2008  24:08.1   M024       1
125  4/3/2008  24:11.8   M024       1
127  4/3/2008  24:13.6   M025       3
129  4/3/2008  24:14.0   M024       1

print df.pivot_table(index=['Date','Time'], 
                     columns='Sensor', 
                     values='Status', 
                     fill_value='',
                     aggfunc=np.mean).rename_axis(None, axis=1).reset_index()

       Date     Time M024 M025
0  4/3/2008  24:08.1  1.5     
1  4/3/2008  24:11.8    1     
2  4/3/2008  24:13.6         3
3  4/3/2008  24:14.0    1     

可能会改变,例如到sum - aggfunc=sum

print df.pivot_table(index=['Date','Time'], 
                     columns='Sensor', 
                     values='Status', 
                     fill_value='',
                     aggfunc=sum).rename_axis(None, axis=1).reset_index()

       Date     Time M024 M025
0  4/3/2008  24:08.1    3     
1  4/3/2008  24:11.8    1     
2  4/3/2008  24:13.6         3
3  4/3/2008  24:14.0    1     

EDIT1:

按行Date检查所有duplicated值,TimeSensor可以通过以下方式检查:

print df[df.duplicated(subset=['Date', 'Time', 'Sensor'], keep=False)]

如果列Status中的值相同,您可以在转动之前drop_duplicates

df = df.drop_duplicates(subset=['Date', 'Time', 'Sensor'])  

答案 1 :(得分:1)

另一种方法是

解决方案

df.reset_index(inplace=True)  # just to make sure
df.set_index(['Date', 'Time', 'Sensor', 'Status'], inplace=True)

# this should take care of duplicate sensors
df = df.sort_index().groupby(level=2).last()

df = df.unstack()

我会把它留在这里但是为了回答你的问题,我们将再采取一步

df.reset_index(inplace=True)