如何使用 pandas 从具有 pivot_table 的列创建列
How to use pandas to create columns from one with pivot_table
我有一个包含非结构化信息的 csv。我想使用 pandas 中的 pivot_table(或合并?),使每个 instance.task_id.number 只有一行,并在多个列中展开度量问题。
例如,如果我有 4 instance.task_id_number,我需要有 4 列 metric.question
我尝试使用 pivot 和 pivot.table 并合并,但没有符合我的期望。
感谢您的帮助!
#Edit : 按照要求,我做了一个例子 :
我有什么:
df = pd.DataFrame([["A", 2], ["A", 3], ["A", 6], ["B", 10], ["B", 11], ["B", 12]])
我想要什么:
df2 = pd.DataFrame([["A", 2, 3, 6], ["B", 10, 11, 12]])
#Edit 2:我用 pivot_table 尝试使用真实数据框。我将 aggfunc 与 "metric.question 放在一起并将其放入值中。
我收到错误:
AttributeError: 'SeriesGroupBy' 对象没有属性 'index'。
我尝试重置索引,但效果并不好。代码:
import pandas as pd
stockage = pd.read_csv(r"C:\Users\vion1\Ele\Engie\Import_Engie\asmt_assessment_instance_question.csv", encoding="cp1252")
df = pd.DataFrame(stockage)
#df = df.filter(["instance.task_id.number", "metric.question"], axis = 1)
df2 = df.reset_index(drop = True).pivot_table(index=['instance.task_id.number'],
columns='metric.question',
values=["instance","instance.trigger_id","instance.task_id.number","instance.taken_on","instance.state",
"string_value","metric.order","value","sys_updated_on","instance.task_id.company",
"instance.user.u_company_customer.u_customer_trigram","instance.task_id.contact_type",
"instance.task_id.assignment_group"], aggfunc="metric.question")
print(df2)
df2.to_csv(r"C:\Users\vion1\Ele\Engie\Import_Engie\resultat.csv")
你能试试这个吗:
>>> df.assign(cols=df.groupby('instance.task_id.number').cumcount()) \
.pivot(index='instance.task_id.number',
columns='cols',
values='metric.question') \
.rename_axis(index=None, columns=None)
0 1 2 3
REQ0510079 Q1 Q2 Q3 Q4
REQ0527568 Q1 Q2 Q3 Q4
旧答案
关注我的评论:
data = {'instance.task_id.number': ['REQ0510079','REQ0510079','REQ0510079','REQ0510079',
'REQ0527568','REQ0527568','REQ0527568','REQ0527568'],
'metric.question': ['Q1', 'Q2', 'Q3', 'Q4', 'Q1', 'Q2', 'Q3', 'Q4']}
df = pd.DataFrame(data)
使用pivot
:
>>> df.pivot(index='instance.task_id.number',
columns='metric.question',
values='metric.question')
metric.question Q1 Q2 Q3 Q4
instance.task_id.number
REQ0510079 Q1 Q2 Q3 Q4
REQ0527568 Q1 Q2 Q3 Q4
我有一个包含非结构化信息的 csv。我想使用 pandas 中的 pivot_table(或合并?),使每个 instance.task_id.number 只有一行,并在多个列中展开度量问题。
例如,如果我有 4 instance.task_id_number,我需要有 4 列 metric.question 我尝试使用 pivot 和 pivot.table 并合并,但没有符合我的期望。
感谢您的帮助!
#Edit : 按照要求,我做了一个例子 :
我有什么:
df = pd.DataFrame([["A", 2], ["A", 3], ["A", 6], ["B", 10], ["B", 11], ["B", 12]])
我想要什么:
df2 = pd.DataFrame([["A", 2, 3, 6], ["B", 10, 11, 12]])
#Edit 2:我用 pivot_table 尝试使用真实数据框。我将 aggfunc 与 "metric.question 放在一起并将其放入值中。
我收到错误:
AttributeError: 'SeriesGroupBy' 对象没有属性 'index'。
我尝试重置索引,但效果并不好。代码:
import pandas as pd
stockage = pd.read_csv(r"C:\Users\vion1\Ele\Engie\Import_Engie\asmt_assessment_instance_question.csv", encoding="cp1252")
df = pd.DataFrame(stockage)
#df = df.filter(["instance.task_id.number", "metric.question"], axis = 1)
df2 = df.reset_index(drop = True).pivot_table(index=['instance.task_id.number'],
columns='metric.question',
values=["instance","instance.trigger_id","instance.task_id.number","instance.taken_on","instance.state",
"string_value","metric.order","value","sys_updated_on","instance.task_id.company",
"instance.user.u_company_customer.u_customer_trigram","instance.task_id.contact_type",
"instance.task_id.assignment_group"], aggfunc="metric.question")
print(df2)
df2.to_csv(r"C:\Users\vion1\Ele\Engie\Import_Engie\resultat.csv")
你能试试这个吗:
>>> df.assign(cols=df.groupby('instance.task_id.number').cumcount()) \
.pivot(index='instance.task_id.number',
columns='cols',
values='metric.question') \
.rename_axis(index=None, columns=None)
0 1 2 3
REQ0510079 Q1 Q2 Q3 Q4
REQ0527568 Q1 Q2 Q3 Q4
旧答案
关注我的评论:
data = {'instance.task_id.number': ['REQ0510079','REQ0510079','REQ0510079','REQ0510079',
'REQ0527568','REQ0527568','REQ0527568','REQ0527568'],
'metric.question': ['Q1', 'Q2', 'Q3', 'Q4', 'Q1', 'Q2', 'Q3', 'Q4']}
df = pd.DataFrame(data)
使用pivot
:
>>> df.pivot(index='instance.task_id.number',
columns='metric.question',
values='metric.question')
metric.question Q1 Q2 Q3 Q4
instance.task_id.number
REQ0510079 Q1 Q2 Q3 Q4
REQ0527568 Q1 Q2 Q3 Q4