用python中的key / id将行中的值除

时间:2018-07-02 11:51:09

标签: python dataframe

我有以下数据集

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

1 个答案:

答案 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仍然对应于右边行。