Как преобразовать следующий текст в Pandas Dataframe? - PullRequest
0 голосов
/ 25 июня 2018

Следующие данные хранятся в файле, который я прочитал с помощью readlines () .

1 июня

Завтрак - 20

Обед - 40

Закуски - 10

Билет на автобус - 130

Авто - 60

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

Даты в данных должны быть индексом кадра данных, за которым следуют элементы в качестве имен столбцов, а стоимость - в качестве значений столбцов.

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Использование:

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  
0 голосов
/ 25 июня 2018

Так что, если бы это был я, я бы поставил все в диктовку, а затем построил бы информационный фрейм из этого диктанта. Есть ли в ваших строках данных какие-либо части, которые похожи на значения определенного типа? Значения вашего индекса (ordinalnumber Month) отличаются от значений столбцов (columname - data)?

Бросьте эти значения индекса в ваш dict как ключи, а затем ваши столбчатые значения в dict в виде списка кортежей или dict, например:
my_pandas_dict = { "ordNum Month" : { "columname" : data, "columname" : data, "columname" : data, ... }, ... }

Затем посмотрите документацию pandas , чтобы понять, как сделать DataFrame из диктанта.

(предостережение: возможно, я организовал данные в этом документе таким образом, который не pandas уместен. Посмотрите на документы и выясните, как правильно организовать их)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...