为了账号安全,请及时绑定邮箱和手机立即绑定

将仅包含行的连续文本文件解析为熊猫数据框

将仅包含行的连续文本文件解析为熊猫数据框

慕码人2483693 2022-12-27 16:50:00
我有一个包含重复行的文本文件,我想转换成一个数据框。10/21/2019abcdef100.0010/22/2019ghijk120.00有一个明显的模式,我希望数据框看起来像这样:Data       | Description | Amount10/21/2019 | abcdef      | 100.0010/22/2019 | ghijk       | 120.00这是怎么做到的?
查看完整描述

3 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

一些正则表达式来提取细节,然后向前填充前两列并删除空值


pattern = r"(?P<Date>\d{2}/\d{2}/\d{4})|(?P<Description>[a-z]+)|(?P<Amount>\d{1,}\.00)"


res = (df1.text.str.extract(pattern)

       .assign(Date = lambda x: x.Date.ffill(),

               Description = lambda x: x.Description.ffill()

              )

       .dropna(how='any')

      )


res



     Date   Description Amount

2   10/21/2019  abcdef  100.00

5   10/22/2019  ghijk   120.00

如果你不关心正则表达式,并且格式是不变的,那么我们可以用 numpy 重塑数据并创建一个新的数据框。


#reshape the data

#thanks to @Chester 

#removes unnecessary computation

res = np.reshape(df1.to_numpy(),(-1,3))



#create new dataframe

pd.DataFrame(res,columns=['Date','Description','Amount'])


       Date Description Amount

0   10/21/2019  abcdef  100.00

1   10/22/2019  ghijk   120.00


查看完整回答
反对 回复 2022-12-27
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

将原始数据从文件读取到 aSeries并转换为PandasArray以简化以后对索引的处理:

raw_data = pd.read_csv("path\to\a\data\file.txt", names=['raw_data'], squeeze=True).array

创建一个DataFrame使用切片:

df = pd.DataFrame(data={'Data': raw_data[::3], 'Description': raw_data[1::3], 'Amount': raw_data[2::3]})

只需 2 个简单的步骤,无需正则表达式和不必要的转换。简短高效。


查看完整回答
反对 回复 2022-12-27
?
12345678_0001

TA贡献1802条经验 获得超5个赞

如果您的字符串具有您提到的确切模式,则可以使用以下代码


string = '''10/21/2019

abcdef

100.00

10/22/2019

ghijk

120.00'''


token_list = string.split()


Data = token_list[0::3]

Description = token_list[1::3]

Amount = token_list[2::3]


Aggregate = list(zip(Data, Description, Amount))

df = pd.DataFrame(Aggregate, columns = ['Data ', 'Description', 'Amount'])


查看完整回答
反对 回复 2022-12-27
  • 3 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号