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