【发布时间】:2016-05-15 01:27:10
【问题描述】:
在我看来,这是 Pandas 的终极挑战,尽管对你们中的一些人来说可能是初级的......
我正在尝试将特定工作职位与其对应的调查项目联系起来。例如,站点 A 的总裁将归因于站点 A 的受访者提供反馈的调查项目的结果(即“您在多大程度上同意以下陈述?:“我认为站点 A 的质量是足够的整体"")。
每个站点有 5 个站点(0 到 4)。每个工作职位被分配到一个或多个站点的一个或多个站点。
例如,一个站点的总裁在该站点内的所有站点工作,而承包商可能只在几个站点工作,可能在 2 个不同的站点。
收集了有关每个站点内每个站点质量的调查数据。
一些调查项目与一个或多个站点内的某些站点有关。
例如,“职位”表如下所示:
import pandas as pd
import numpy as np
pos = pd.DataFrame({'Station(s)':[',1,2,,','0,1,2,3,4'],
'Position':['Contractor','President'],
'Site(s)':['A,B','A'],
'Item(s)':['1','1,2']
})
pos[['Position','Site(s)','Station(s)','Item(s)']]
Position Site(s) Station(s) Item(s)
0 Contractor A,B ,1,2,, 1
1 President A 0,1,2,3,4 1,2
调查数据表如下所示:
sd = pd.DataFrame({'Site(s)':['A','B','B','C','A','A'],
'Station(s)':[',1,2,,',',1,2,,',',,,,',',1,2,,','0,1,2,,',',,2,,'],
'Item 1':[1,1,0,0,1,np.nan],
'Item 2':[1,0,0,1,0,1]})
sd[['Site','Station(s)','Item 1','Item 2']]
Site Station(s) Item 1 Item 2
0 A ,1,2,, 1 1
1 B ,1,2,, 1 0
2 B ,,,, 0 0
3 C ,1,2,, 0 1
4 A 0,1,2,, 1 0
5 A ,,2,, NaN 1
2 旁注:
由于不重要的原因,项目数据已被编码为 1 和 0。
逗号分隔的响应实际上是从列中压缩的(每个站点和项目一列)。我只提到这一点是因为如果最好不要压缩它们,那可以(或不)。
这就是我需要的:
这个(我认为):
Contractor President Site(s) Station(s) Item 1 Item 2
0 1 1 A ,1,2,, 1 1
1 1 0 B ,1,2,, 1 0
2 0 0 B ,,,, 0 0
3 0 0 C ,1,2,, 0 1
4 0 1 A 0,1,2,, 1 0
5 1 1 A ,,2,, NaN 1
逻辑:
承包商在站点 A 和 B 工作,并且只应与在其中一个站点工作的受访者相关联。 在这些受访者中,他应该只与在 1 号或 2 号站工作但没有也在 任何其他(即站 0)。
因此,承包商在 df2 中感兴趣的行是索引 0、1 和 5。 总统感兴趣的行来自索引 0、4 和 5。
...最终,这是:
Position Overall%
0 Contractor 100
1 President 80
逻辑:
由于总统关心第 1 项和第 2 项,因此需要考虑 5 个数字:第 1 项中的(1 和 1)和第 2 项中的(1、0 和 1)。 项目总和为 4,项目计数为 5(同样,不计算 'NaN'),即为 80%。
由于承包商只关心项目 1,因此需要考虑 2 个数字:1 和 1 - 不应计算“NaN” - (分别来自感兴趣的行)。因此,总和是计数中的 2,即 2,即 100%
提前致谢!
更新
我知道这行得通 (top answer just under question),但如何将其应用于这种情况?我试过这个(只是为了尝试逻辑的第一部分):
for i in pos['Position']:
sd[i]=[x for x in pos.loc['Site(s)'] if x in sd['Site']]
...但它抛出了这个错误:
KeyError: 'the label [Site(s)] is not in the [index]'
...所以我还在努力。
【问题讨论】:
标签: python-3.x pandas pivot-table