【问题标题】:How to use pandas to create columns from one with pivot_table如何使用 pandas 从一个具有 pivot_table 的列中创建列
【发布时间】:2021-10-02 22:40:56
【问题描述】:

我有一个包含非结构化信息的 csv。我想使用 pandas 中的 pivot_table (或 merge ?),让每个 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")

【问题讨论】:

  • 请包含任何相关信息as text directly into your question,请勿链接或嵌入源代码或数据的外部图像。图像难以有效地为您提供帮助,因为它们无法复制,并且由于无法搜索而提供较差的可用性。见:Why not upload images of code/errors when asking a question?
  • 如果您需要帮助将 DataFrame 的一个小样本格式化为可复制的代码片段,请参阅How to make good reproducible pandas examples
  • pivot 的预期输出是什么。你有index='instance.task_id.number'columns='metric.question'values=?
  • 我按要求编辑问题。作为值,我想要 metric.question 的行。 csvfile 更大,我只用了两列来简化问题,但是在我必须添加每一列之后,我的第一步是有一个“instance.task_id.number

标签: python pandas merge pivot pivot-table


【解决方案1】:

你可以试试这个:

>>> 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

【讨论】:

  • 我收到错误消息:“ValueError:索引包含重复条目,无法重塑”
  • 它适用于一列,谢谢!但是当我想删除我使用的过滤器并在我的 csvfile 中添加每一列时,它会复制每一列的“instance.task_id.number”的数量。我猜它对每一列都有效。我使用的过滤器是:df = df.filter(["instance.task_id.number", "metric.question"], axis = 1) 我仍然只想要一个 instance.task_id.number,传播度量问题,但保留其他值“正常”
  • 您必须使用pivot_table,但您需要定义一个aggfunc 来处理重复值(first、last、mean、sum,...)。请尝试设置一个有错误的示例。
  • 我尝试了一些方法,使用教程“Pivoting with aggregating”和 pandas 文档
  • 啊哈是的,为什么?我认为这里没有私人信息
猜你喜欢
  • 2021-12-29
  • 2017-01-27
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
  • 2016-01-22
  • 2017-04-21
相关资源
最近更新 更多