我的数据框如下所示:
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
任何帮助表示感谢。
答案 0 :(得分:1)
我认为您需要pivot_table
rename_axis
(pandas
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
转换为int
或float
,因为它似乎不是数字(虽然看起来像数字):
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
值,Time
和Sensor
可以通过以下方式检查:
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)