以下数据存储在我使用 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
数据中的日期应该是数据框的索引,后跟作为列名称的项目以及作为列值的成本。
答案 0 :(得分:2)
使用:
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
然后创建3个新列-首先向前填充mask
创建的NaN
,然后重复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
答案 1 :(得分:0)
因此,如果是我,我会将所有内容放入字典中,然后根据该字典构建数据框。您的数据行中是否包含与某种类型的值相似的任何部分?您的索引值(ordinalnumber Month
)与列值(columname - data
)是否有所不同?
将这些索引值作为键放入dict中,然后将列值作为元组或dict的列表放入dict中,例如:
my_pandas_dict = {
"ordNum Month" :
{
"columname" : data,
"columname" : data,
"columname" : data,
...
},
...
}
然后查看pandas documentation,以了解如何根据字典制作DataFrame。
(注意:我可能以不适合pandas
的方式组织了该字典中的数据。请查看文档并弄清楚如何正确地组织数据)