如何将以下文本转换为Pandas Dataframe?

时间:2018-06-25 03:59:40

标签: python python-3.x 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

数据中的日期应该是数据框的索引,后跟作为列名称的项目以及作为列值的成本。

2 个答案:

答案 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_indexunstack重塑,如有必要,将值的原始顺序添加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的方式组织了该字典中的数据。请查看文档并弄清楚如何正确地组织数据)