【发布时间】:2019-07-27 03:30:42
【问题描述】:
我目前有一个 pandas 数据框,内容如下:
0 (dev_id='A', accon_time='B', start_time='C',end_time='D')
1 (dev_id='E', accon_time='F', start_time='G',end_time='H')
2 (dev_id='I', accon_time='J', start_time='K',end_time='L')
这个数据框的当前形状是 (574,1),而我实际上希望它是 (574,4),其中每行中的 4 个逗号分隔值中的每一个实际上都拆分为 4 个单独的列。
有什么办法吗?
- 此数据来自 SQL Alchemy 查询
我尝试先将查询转换为 pandas 系列,然后使用 Series.str.split,但结果与原始数据框相同。
ser = pd.Series(qry)
ser.str.rsplit(pat=",", n=4, expand=True)
print(ser)
df = pd.DataFrame(data=ser)
print(df)
这是我用来查询数据的:
class Trip(Base):
__tablename__ = 'trip'
dev_id = Column(String(50), primary_key=True)
accon_time = Column(Integer)
start_time = Column(Integer)
end_time = Column(Integer)
def __repr__(self):
return "(dev_id='%s', accon_time='%s', start_time='%s',end_time='%s')"
% (self.dev_id, self.accon_time, self.start_time, self.end_time)
qry = session.query(Trip).\
filter(Trip.accon_time.between(20190620000000, 20190621000000)).\
filter(Trip.start_time <= 20190620145813).\
filter(Trip.end_time <= 20190620151400).\
filter(Trip.end_time >= 20190620145600)
这会返回一个像这样的列表:
(dev_id='A', accon_time='B', start_time='C',end_time='D'),(dev_id='E', accon_time='F', start_time='G',end_time='H'),(dev_id='I', accon_time='J', start_time='K',end_time='L')
将我的查询结果转换为 pandas 数据框
df = pd.DataFrame(data=qry)
print(df)
【问题讨论】:
-
嘿只是为了确定你在df中的元素是一个字符串吗?即“(dev_id='A', accon_time='B', start_time='C',end_time='D')”?
-
你应该在你的例子中尝试
ser = ser.str.rsplit(pat=",", n=4, expand=True)而不是ser.str.rsplit(pat=",", n=4, expand=True) -
老实说,您可能应该将数据作为数据提取出来,而不是通过
__repr__然后尝试解压您的字符串。 -
@kkawabat 刚刚尝试过,它返回一个空系列,如下所示:0 0 NaN 1 NaN