如何采取多行并转换其中的一些成列
问题描述:
,我有以下数据集:如何采取多行并转换其中的一些成列
QuestionID RowID ColID MenuID SourceRowID SourceColumnID SourceVariationID ResponseCount
---------- ---------- ---------- ------ ----------- -------------- ----------------- -------------
316923119 3029903189 3029903193 0 3029903177 3029903181 0 773
316923119 3029903189 3029903193 0 3029903177 3029903182 0 788
316923119 3029903189 3029903193 0 3029903177 3029903183 0 778
316923119 3029903189 3029903193 0 3029903177 3029903184 0 803
316923119 3029903189 3029903194 0 3029903177 3029903181 0 766
316923119 3029903189 3029903194 0 3029903177 3029903182 0 799
316923119 3029903189 3029903194 0 3029903177 3029903183 0 782
316923119 3029903189 3029903194 0 3029903177 3029903184 0 773
我想将其转换为数据集:
QuestionID RowID ColumnID MenuID 3029903181 3029903182 3029903183 3029903184 ResponseCount
---------- ---------- ---------- ------ ------- ------- ------- ------- -------------
316923119 3029903189 3029903193 0 773 788 778 803 3142
316923119 3029903189 3029903194 0 766 799 782 773 3120
这些被表示为这在Python:
[
{
'QuestionID': 316923119,
'RowID': 3029903189,
'ColID': 3029903193,
'SourceColumnID': 3029903181,
'ResponseCount': 773
},
{
'QuestionID': 316923119,
'RowID': 3029903189,
'ColID': 3029903193,
'SourceColumnID': 3029903182,
'ResponseCount': 788
},
{
'QuestionID': 316923119,
'RowID': 3029903189,
'ColID': 3029903193,
'SourceColumnID': 3029903183,
'ResponseCount': 778
},
{
'QuestionID': 316923119,
'RowID': 3029903189,
'ColID': 3029903193,
'SourceColumnID': 3029903184,
'ResponseCount': 803
},
{
'QuestionID': 316923119,
'RowID': 3029903189,
'ColID': 3029903194,
'SourceColumnID': 3029903181,
'ResponseCount': 766
},
{
'QuestionID': 316923119,
'RowID': 3029903189,
'ColID': 3029903194,
'SourceColumnID': 3029903182,
'ResponseCount': 799
},
{
'QuestionID': 316923119,
'RowID': 3029903189,
'ColID': 3029903194,
'SourceColumnID': 3029903183,
'ResponseCount': 782
},
{
'QuestionID': 316923119,
'RowID': 3029903189,
'ColID': 3029903194,
'SourceColumnID': 3029903184,
'ResponseCount': 773
},
]
,我想:
[
{
'QuestionID': 316923119,
'RowID': 3029903189,
'ColID': 3029903193,
'3029903181': 773,
'3029903182': 788,
'3029903183': 778,
'3029903184': 803,
'ResponseCount': 3142
},
{
'QuestionID': 316923119,
'RowID': 3029903189,
'ColID': 3029903194,
'3029903181': 766,
'3029903182': 799,
'3029903183': 782,
'3029903184': 773,
'ResponseCount': 3120
},
]
这里的重大变化是将行SourceColumnID合并到由相同的QuestionID,RowID和ColID分组的列中,然后将它们全部组合到新的列ResponseCount中。
我宁愿将这些数据加载到熊猫中,并用DataFrame进行转换,但任何建议都是值得欢迎的。
编辑
从TomAugspurger答案几乎以下工作:
In [90]: df
Out[90]:
ColID QuestionID ResponseCount RowID SourceColumnID
0 3029903193 316923119 773 3029903189 3029903181
1 3029903193 316923119 788 3029903189 3029903182
2 3029903193 316923119 778 3029903189 3029903183
3 3029903193 316923119 803 3029903189 3029903184
4 3029903194 316923119 766 3029903189 3029903181
5 3029903194 316923119 799 3029903189 3029903182
6 3029903194 316923119 782 3029903189 3029903183
7 3029903194 316923119 773 3029903189 3029903184
[8 rows x 5 columns]
In [91]: counts = df.pivot_table(values='ResponseCount', rows=['ColID', 'QuestionID', 'RowID'], cols='SourceColumnID', aggfunc='sum')
In [92]: counts['ResponseCount'] = counts.sum(1)
In [93]: counts
Out[93]:
SourceColumnID 3029903181 3029903182 3029903183 3029903184 ResponseCount
ColID QuestionID RowID
3029903193 316923119 3029903189 773 788 778 803 3142
3029903194 316923119 3029903189 766 799 782 773 3120
[2 rows x 5 columns]
但是,这并不让我访问我的需要,我应该能够抓住数和访问数据的方式在新的列在得到他们的罪状:
counts[0][3029903181]
应该返回773
发现这个工作:
int(counts.iloc[0][3029903181])
答
数据透视表应该做的伎俩。
In [54]: counts = df.pivot_table(values='ResponseCount',
rows=['ColID', 'QuestionID', 'RowID'],
cols='SourceColumnID', aggfunc='sum')
In [55]: counts
Out[55]:
SourceColumnID 3029903181 3029903182 3029903183 \
ColID QuestionID RowID
3029903193 316923119 3029903189 773 788 778
3029903194 316923119 3029903189 766 799 782
SourceColumnID 3029903184
ColID QuestionID RowID
3029903193 316923119 3029903189 803
3029903194 316923119 3029903189 773
[2 rows x 4 columns]
要得到ResponseCount
列,它看起来像您跨列求和:
In [57]: counts['ResponseCount'] = counts.sum(1)
In [58]: counts
Out[58]:
SourceColumnID 3029903181 3029903182 3029903183 \
ColID QuestionID RowID
3029903193 316923119 3029903189 773 788 778
3029903194 316923119 3029903189 766 799 782
SourceColumnID 3029903184 ResponseCount
ColID QuestionID RowID
3029903193 316923119 3029903189 803 3142
3029903194 316923119 3029903189 773 3120
[2 rows x 5 columns]
最后,你有一个MenuID
列。由于您未指定计算方式以及是否对每个组都是唯一的,因此我将它从我的答案中排除。你可能会想要这样的东西,如df.groupby(['ColID', 'QuestionID', 'RowID'])['MenuID']
和.sum()
或.head(1)
。
这几乎工作如何我需要它,所以我需要它被表示,以便我可以像二次字典访问它,所以如果我确实计数[0] ['3029903181']我会得到773 – sontek
哎呀忘了关于那个部分。很高兴你想出来了。 – TomAugspurger