如何将列转换为标题?- Python Pandas 数据框架

3

i have a dataframe like this

Datetime               status   time
2020-03-28 22:14:08     start   0
2020-03-29 00:28:50     end     02:13:52
2020-03-29 07:15:10     start   0
2020-03-29 07:48:02     end     00:32:47

我该如何将其转换为以下内容
start                    end                    time 
2020-03-28 22:14:08      2020-03-29 00:28:50   02:13:52
2020-03-29 07:15:10      2020-03-29 07:48:02   00:32:47
3个回答

1
我希望您能创建一个新的助手系列,它将使用Series.cumsum进行比较,并通过DataFrame.set_index添加到MulitIndex中,然后通过DataFrame.unstack进行重新整形,最后通过DataFrame.drop和元组来删除不必要的列,因为MultiIndex和列表推导式会创建新的列名。请注意保留HTML标签。
df = (df.set_index([df['status'].eq('start').cumsum(), 'status'])
       .unstack()
       .drop(('time','start'), axis=1))

df.columns = [y if x == 'Datetime' else x for x, y in df.columns]
print (df)
                        end                start      time
status                                                    
1       2020-03-29 00:28:50  2020-03-28 22:14:08  02:13:52
2       2020-03-29 07:48:02  2020-03-29 07:15:10  00:32:47

如果始终匹配成对的start, end,则可以通过在Series.iloc中索引列中的偶数和奇数值,通过Series.reset_index创建默认索引,并通过concat连接在一起来实现:

s = df['Datetime'].iloc[::2].rename('start').reset_index(drop=True)
e = df['Datetime'].iloc[1::2].rename('end').reset_index(drop=True)
t = df['time'].iloc[1::2].reset_index(drop=True)

df = pd.concat([s, e, t], axis=1)
print (df)
                 start                  end      time
0  2020-03-28 22:14:08  2020-03-29 00:28:50  02:13:52
1  2020-03-29 07:15:10  2020-03-29 07:48:02  00:32:47

你能加上数据框的代码吗?我想我有一个更好的答案。但是我太懒了,不想先创建数据框 xD - paradocslover
@paradoxlover - 我复制了这个问题,但我可以解决它,需要一些时间(首先我需要描述解决方案) - jezrael
@paradoxlover - df = pd.DataFrame({'Datetime': ['2020-03-28 22:14:08', '2020-03-29 00:28:50', '2020-03-29 07:15:10', '2020-03-29 07:48:02'], 'status': ['start', 'end', 'start', 'end'], 'time': ['0', '02:13:52', '0', '00:32:47']}) - jezrael
我已经发布了我的答案。请告诉我您对它的看法! - paradocslover
@paradoxlover - 或许更好的方法是创建DataFrame构造函数,例如 pd.DataFrame({'start': a.loc['start']['Datetime'].to_numpy(), ...})。我认为使用inplace不是一个好习惯,请参考这里这里 - jezrael
1
感谢@jezrael。将根据建议进行更改。下次编写任何Python代码时会注意“inplace”问题。 - paradocslover

1
尽管 @jezrael 的回答显然非常棒,这里有一种不同的尝试方法。它使用索引。
import pandas as pd
a  = pd.DataFrame({'Datetime': ['2020-03-28 22:14:08', '2020-03-29 00:28:50', '2020-03-29 07:15:10', '2020-03-29 07:48:02'], 'status': ['start', 'end', 'start', 'end'], 'time': ['0', '02:13:52', '0', '00:32:47']})

a.set_index('status',inplace=True)

c = pd.DataFrame(columns=['start','end','time'])
c['start']  = a.loc['start']['Datetime'].values
c['end']  = a.loc['end']['Datetime'].values
c['time'] = a.loc['end']['time'].values
print(c)

输出:

                 start                  end      time
0  2020-03-28 22:14:08  2020-03-29 00:28:50  02:13:52
1  2020-03-29 07:15:10  2020-03-29 07:48:02  00:32:47

1

给你:

import pandas as pd
from io import StringIO

df = pd.read_csv(StringIO("""
Datetime,status,time
2020-03-28 22:14:08,start,0
2020-03-29 00:28:50,end,02:13:52
2020-03-29 07:15:10,start,0
2020-03-29 07:48:02,end,00:32:47"""))
df['start'] = df['Datetime'].shift()
df = df[df['status'] == 'end'][['start', 'Datetime', 'time']]
df = df.rename(columns={'Datetime': 'end'})
print(df)

输出:

                 start                  end      time
1  2020-03-28 22:14:08  2020-03-29 00:28:50  02:13:52
3  2020-03-29 07:15:10  2020-03-29 07:48:02  00:32:47

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接