首页 > 解决方案 > 如何将以下文本转换为 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 的索引,后跟作为列名的项目和作为列值的成本。

标签: pythonpython-3.xpandasdataframe

解决方案


采用:

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参数创建:namescsv

#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  

推荐阅读