我有以下数据集
Key Measure 01/01/18 01/02/18 01/03/18 01/04/18 01/05/18
A # of exams 121 130 115 120 123
A # of people 1327 1326 1323 1323 1336
B # of exams 124 132 110 118 125
B # of people 1110 1115 1113 1116 1118
我想划分并找到每个关键字的 #of考试/#人数
预期输出:
Key Measure 01/01/18 01/02/18 01/03/18 01/04/18 01/05/18
A # of exams/ppl 0.09 0.10 0.09 0.09 0.09
B # of exams/ppl 0.11 0.12 0.10 0.11 0.11
有什么想法吗?
从答案: 我正在尝试归纳为n个唯一键:
keys_unique=df["Keys"].unique()
columns_unique-我拥有的日期列数
ListOfSeries = []
for i in range(0,len(keys_unique)):
ListOfSeries += [complete_data.iloc[:, 0:len(columns_unique)].iloc[2*i]/complete_data.iloc[:, 0:len(columns_unique)].iloc[2*i+1]]
dnew = pd.DataFrame(ListOfSeries)
IndexError: single positional indexer is out-of-bounds
答案 0 :(得分:1)
我通过执行以下操作重新创建了您的DataFrame:
dat = pd.DataFrame({'Key' : ['A','A','B','B'], 'Measure' : ["# of exams","# of people","# of exams","# of people"],'01/01/18' : [121,1327,124,1110],'01/02/18' : [130,1326,132,1115],'01/03/18' : [115,1323,110,1113],'01/04/18' : [120,1323,118,1116],'01/05/18' : [123,1336,125,1118]})
我得到了:
01/01/18 01/02/18 01/03/18 01/04/18 01/05/18 Key Measure
0 121 130 115 120 123 A # of exams
1 1327 1326 1323 1323 1336 A # of people
2 124 132 110 118 125 B # of exams
3 1110 1115 1113 1116 1118 B # of people
您可以通过执行以下操作获得所需的计算量:
listOfSeries = []
for i in range(0,2):
listOfSeries += [dat.iloc[:, 0:5].iloc[2*i]/dat.iloc[:, 0:5].iloc[2*i+1]]
dnew = pd.DataFrame(listOfSeries)
请注意,我的列的排列方式不像您的列,因此您应将[0:5]
替换为[2:7]
。结果如下:
01/01/18 01/02/18 01/03/18 01/04/18 01/05/18
0 0.091183 0.098039 0.086924 0.090703 0.092066
1 0.111712 0.118386 0.098832 0.105735 0.111807
现在,您只需要添加所需的额外列(非数字列)。您可以通过编写以下内容来添加列:
dnew['Key'] = pd.Series(['A', 'B'])
dnew['Measure'] = pd.Series(['# of exams/ppl', '# of exams/ppl'])
由于您的色谱柱是有序订购的,因此您可以手工完成,而不会丢失任何信息或出现错误。这给您:
01/01/18 01/02/18 01/03/18 01/04/18 01/05/18 Key Measure
0 0.091183 0.098039 0.086924 0.090703 0.092066 A # of exams/ppl
1 0.111712 0.118386 0.098832 0.105735 0.111807 B # of exams/ppl
希望此解决方案适合您,如果您需要补充说明,请随时提问。
-编辑-
如果要针对Key
列自动执行此操作,则可以执行以下操作:
listOfKeys = list(set(dat['Key'].values))
listOfSeries = []
for i in range(0,len(listOfKeys)):
dtemp = dat.loc[dat['Key'] == listOfKeys[i]]
serie = dat.iloc[:, 0:5].iloc[dtemp.index[0]]/dat.iloc[:, 0:5].iloc[dtemp.index[1]]
serie['Key'] = listOfKeys[i]
listOfSeries += [serie]
dnew = pd.DataFrame(listOfSeries)
此代码在Key
中的dat
列中查找所有不同的值。然后,找到dat
的行,其中Key
的值等于特定值,然后将第一行除以第二行。由于它可以更改行的顺序(集合不排序),因此我们需要在Key
循环中添加for
列,以确保Key
仍然对应于右边行。