Использование:
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 новых столбца - сначала повторите даты, заполнив NaN
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