昨天高级市场营销课没怎么听罗总讲创业路,听硕哥讲了一下他毕业论文中遇到的一些问题,之后就一直在思考怎么解决这个问题。
其实很简单,但我正好不怎么了解多层索引,所以还是花了一些时间来想怎么做。
问题大概是这样的,因为硕哥做的是并购交易有关的论文,但是在并购交易中,三方(买方、买方和标方)往往不止有一个公司,但是国泰安数据库把它们放到了一个单元格里:

Yaodo·2019-11-28·644 次阅读
昨天高级市场营销课没怎么听罗总讲创业路,听硕哥讲了一下他毕业论文中遇到的一些问题,之后就一直在思考怎么解决这个问题。
其实很简单,但我正好不怎么了解多层索引,所以还是花了一些时间来想怎么做。
问题大概是这样的,因为硕哥做的是并购交易有关的论文,但是在并购交易中,三方(买方、买方和标方)往往不止有一个公司,但是国泰安数据库把它们放到了一个单元格里:

就像上图中的第9行,我把它单独截出来:

硕哥的意思是,可以把它做成一个长格式,也就是像下面这张图一样:

上面是我做好的一次并购交易,index是事件ID,variable_0表示买方、卖方或者标的方,variable_1表示企业序号,value即为值
我拿到这条数据的时候想的其实也挺简单,就是先抽出所有公司,新成一行,然后加上多层列索引columns_MultiIndex:

然后用melt()方法转成长格式

最后再重加一下索引就成了上面的效果图了
上面说的就是对每一行的处理思路,那么循环到每一行的做法也就出来了,稍微修改一下代码写成循环:
 1import pandas as pd
 2import numpy as np
 3
 4#输入一行数据,返回形如[[买方],[卖方],[标方]]的列表
 5def get_index_list(single):
 6    #依次split买卖标三方的公司,返回公司列表
 7    if single.iloc[0,1] != 0:
 8        Buyer_split = single.iloc[0,1].split(',')
 9    else:
10        Buyer_split = []
11    if single.iloc[0,2] != 0:
12        Seller_split = single.iloc[0,2].split(',')
13    else:
14        Seller_split = [] 
15    if single.iloc[0,3] != 0:
16        Underlying_split = single.iloc[0,3].split(',')
17    else:
18        Underlying_split = []
19    #构造形如[[买方],[卖方],[标方]]的列表
20    index_list = [Buyer_split,Seller_split,Underlying_split]
21    return index_list
22
23#处理单行数据,返回一个事件ID的dataframe格式的信息
24def get_a_row(single,index_list):
25    #多层索引初始化
26    multi_index = []
27    #一行数值初始化
28    one = []
29    #将index_list的公司传给one
30    for i in range(int(len(index_list))):
31        for j in range(int(len(index_list[i]))):
32            #0表示买方,1表示卖方,2表示标方
33            multi_index.append((i,j))
34            one.append(index_list[i][j])
35    #构建行索引index
36    index = [single.iloc[0,0]]*int(len(one))
37    #构建多层列索引columns
38    columns = pd.MultiIndex.from_tuples(multi_index)
39    #将one这个list转成dataframe
40    df = pd.DataFrame(one).T
41    #修改层次(列)索引
42    df.columns=columns
43    #转置
44    df = df.melt()
45    #修改行索引
46    df.index = index
47    return df
48
49if __name__ == '__main__':
50    #读取原始列表,请修改路径
51    origin = pd.read_excel('origin.xlsx')
52    #筛选“事件ID”、“买方”、“卖方”、“标方”
53    test = origin.reindex(columns=['EventID','Buyer','Seller','Underlying'])
54    #用0替换所有NaN
55    test = test.fillna(0)
56    #先做第一行的数据
57    single = test.iloc[1,:]
58    single = pd.DataFrame(single).T
59    index_list  = get_index_list(single)
60    new_df = get_a_row(single,index_list)
61    #循环执行第二行以后的数据
62    for i in range(2,int(len(test))):
63        single = test.iloc[i,:]
64        single = pd.DataFrame(single).T
65        index_list  = get_index_list(single)
66        df = get_a_row(single,index_list)
67        new_df = new_df.append(df)
68    #存储为Excel,请修改路径
69    new_df.to_excel('parsed.xls')