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

Turn values in a DataFrame column into column labels

我的数据框如下所示:

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    

感谢任何帮助。

我觉得你需要pivot_table with rename_axis (new in pandas 0.18.0) and 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     

编辑 1:

DateTimeSensor 列检查所有 duplicated 值可以通过:

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

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

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

另一种方法是

解决方案

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)