python - 如何将以下文本转换为 Pandas Dataframe?
问题描述
以下数据存储在我使用readlines()读取的文件中。
6 月 1 日
早餐 - 20
午餐 - 40
零食 - 10
巴士票 - 130
自动 - 60
6 月 3 日
巴士票- 206
自动 - 71
租金 - 3385
电力 - 1085
晚餐 - 120
我已经尝试了很多东西,但无法获得确切的输出。所需的输出是:
Breakfast Lunch Snacks Bus Ticket Auto Rent Electricity Dinner
1st June 20 40 10 130 60 0 0 0
3rd June 0 0 0 206 71 3385 1085 120
数据中的日期应该是 Dataframe 的索引,后跟作为列名的项目和作为列值的成本。
解决方案
采用:
import pandas as pd
temp=u"""1st June
Breakfast - 20
Lunch - 40
Snacks - 10
Bus Ticket - 130
Auto - 60
3rd June
Bus Ticket - 206
Auto - 71
Rent - 3385
Electricity - 1085
Dinner - 120"""
如果没有以下标题,则首先DataFrame
使用read_csv
参数创建:names
csv
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), names=['data'])
print (df)
data
0 1st June
1 Breakfast - 20
2 Lunch - 40
3 Snacks - 10
4 Bus Ticket - 130
5 Auto - 60
6 3rd June
7 Bus Ticket - 206
8 Auto - 71
9 Rent - 3385
10 Electricity - 1085
11 Dinner - 120
NaN
然后创建 3 个新列 - 首先通过前向填充由创建的 s 重复日期mask
,然后通过split
值和删除不必要的行dropna
:
mask = df['data'].str.contains('-')
df['a'] = df['data'].mask(mask).ffill()
df[['b', 'c']] = df['data'].where(mask).str.split(' - ', expand=True)
df = df.dropna(subset=['b'])
最后通过set_index
和进行整形unstack
,如有必要,添加reindex
和用于数据清理的原始值顺序rename_axis
:
df = (df.set_index(['a','b'])['c']
.astype(int)
.unstack(fill_value=0)
.reindex(columns=df['b'].unique())
.rename_axis(None)
.rename_axis(None, axis=1))
print (df)
Breakfast Lunch Snacks Bus Ticket Auto Rent Electricity \
1st June 20 40 10 130 60 0 0
3rd June 0 0 0 206 71 3385 1085
Dinner
1st June 0
3rd June 120
推荐阅读
- python - 如何在 / 处修复 Django TemplateDoesNotExist?
- c++ - 在 cmake 中使用 Pcap++ 库
- python - Flask 1.0 中的蓝图注册
- html - 单击只有 div 类可用的网站的复选框
- docker - 如何从命令行指定要公开的端口和自定义参数
- javascript - 在使用钩子制作的反应倒计时计时器上格式化时间时出现问题
- css - 为什么我的媒体查询会影响每个宽度,而不仅仅是针对我设置的 (max-width: 860px)?
- python - 从多个文件中取消引用 JSON
- date - 如何使用带有图片语句的 proc 格式将日期格式更改为新格式
- c++ - 在 Eclipse 中获取错误消息:“错误:'operator=' 不匹配”