【问题标题】:Python or Pandas Data Summarization(Converting Table into Dictionary of row_name:[col_name, value]....)Python 或 Pandas 数据汇总(将表转换为 row_name 的字典:[col_name, value]....)
【发布时间】:2020-08-07 12:33:27
【问题描述】:

请在下面的数据中找到索引名称重复 3 到 5 次的数据,因为月度报告不正确地合并了 3 个月,然后才交给我。

Name    Score   Rating
Peralta 0   40
Peralta 20  0
Peralta 0   0
Amy 0   40
Amy 20  40
Amy -20 40
Terry   0   0
Terry   -20 40
Terry   0   -40
Gina    20  0
Gina    0   0
Gina    -20 40

到目前为止,我只提取了列名,如最后的代码所示。但我无法将 “列名”“单元格值” 放在一起。

我需要按以下格式汇总数据: (结果可以有制表符或逗号,视您的喜好而定。)

### Final Result
# IndexName [col_name, cell_value]  [sum of positive numbers, result] [sum of negative numbers, result]


Peralta [Rating, 40]    [Score, 20]     [Sum_Total_of_positive_numbers, 60]
Amy     [Rating, 40]    [Score, 20]     [Rating, 40]    [Score, -20]    [Rating, 40]    [Sum_Total_of_positive_numbers, 140]    [Sum_Total_of_negative_numbers, -20]
Terry   [Score, -20]    [Rating, 40]    [Rating, -40]   [Sum_Total_of_positive_numbers, 40] [Sum_Total_of_negative_numbers, -60]
Gina    [Score, 20]     [Score, -20]    [Rating, 40]    [Sum_Total_of_positive_numbers, 60] [Sum_Total_of_negative_numbers, -20]

所有用于汇总数据的标准 pandas 函数都没有帮助,和/或可用于以上述格式提供摘要的其他库不存在。

以下代码实际上有助于降低列名,但是与该列+行相关的单元格的值没有出现..

for k, v in dff_dict.items():               # k: name of index, v: is a df
    check = v.columns[(v == 20).any()]
    if len(check) > 0:
        print((k, check.to_list()), file=open("output.txt", "a"))

请问有什么方法可以实现第二张表中显示的“最终结果”? (最终结果不一定是任何特定格式,如数据框或表格) 谢谢。。

注意:

原始数据可能包含20多列数百行,但我已经对数据进行了简化,所以请不要只限于几行或几列。'

最后 2 个括号内的值显示了该行中所有正数和负数的总和,在降低值后。正数和负数分开。

这里有一篇有用的文章(Closest Possible answer),但是我需要 [column_name, value] 而不仅仅是 [row:value]

【问题讨论】:

  • 您的“最终结果”似乎不是表格格式,您希望将其作为字典列表吗?
  • 亲爱的@Jimmar,是的,请,它可以是任何格式,根本不需要是熊猫数据框或任何表格。因为它最终会被非程序员阅读和分析完全没有编码知识,也对excel没有任何兴趣..他们只需要格式的数据,最后一项是所有正数和负数的总和......欢迎任何格式的解决方案
  • @Jimmar 请在上面找到一个小修改,其中 + 和 - 的总和分别用括号括起来......再次感谢你......
  • 为了清楚起见,请编辑此问题。存在语法问题,我不知道所需的输出是什么
  • @anon01 期望的结果是第二个编码部分,从评论开始 "### Final Result"... 结果再次显示在第二个评论下方编码部分...

标签: python pandas


【解决方案1】:

考虑到“正数和负数分别相加”的要求,我认为如果您可以将整个数据集分成两部分,这会更容易。

从您的示例数据开始:

import pandas as pd
import numpy as np
data = [
{"Name": "Peralta", "Score": 0, "Rating": 40},
{"Name": "Peralta", "Score": 20, "Rating": 0},
{"Name": "Peralta", "Score": 0, "Rating": 0},
{"Name": "Amy", "Score": 0, "Rating": 40},
{"Name": "Amy", "Score": 20, "Rating": 40},
{"Name": "Amy", "Score": -20, "Rating": 40},
{"Name": "Terry", "Score": 0, "Rating": 0},
{"Name": "Terry", "Score": -20, "Rating": 40},
{"Name": "Terry", "Score": 0, "Rating": -40},
{"Name": "Gina", "Score": 20, "Rating": 0},
{"Name": "Gina", "Score": 0, "Rating": 0},
{"Name": "Gina", "Score": -20, "Rating": 40},
]
df = pd.DataFrame(data).set_index("Name")

我们可以使用正值和负值预测:

df_pos = df.where(df>=0, other=0)
df_neg = df.where(df<0, other=0)

然后分组和求和以获得您想要的结果:

df_pos = df_pos.groupby(by="Name").sum()
df_pos["total_positive"] = df_pos.apply(np.sum, axis=1)

df_neg = df_neg.groupby(by="Name").sum()
df_neg["total_negative"] = df_neg.apply(np.sum, axis=1)

注意 - 在此阶段,数据仍位于两个数据帧中,并未展平为您显示的 [field, value] 格式。

【讨论】:

  • 亲爱的@Josh,非常感谢您的解决方案。实际上数据是从外部 pandas df(来自 csv)加载的。如果我只做 ** data = pd .read_csv("input.csv", index="Name") -__{ 实际上当我尝试它时,它给了我错误:: parser_f() got an unexpected keyword argument 'index' 请帮助请...
  • 这应该可以正常工作,只需稍作改动。您正在用文件替换 data,因此您可以删除 data = [...] 并从分配 df 开始,如下所示:df = pd.read_csv("data.csv", index_col="Name")。请注意,这假设数据位于名为 data.csv 的文件中,并且与您的脚本位于同一目录中 - 您可能需要在那里进行修改。还要注意参数是index_col,而不是index
  • 再次感谢,也请帮助我如何在“.csv”或“.txt”文件中查看这些新数据。我已尝试将其打印到文件中,但我无法解决...真的很抱歉,再次感谢您,请告诉我如何将其保存到文件中...
  • df_pos.to_csv("df_pos.csv") 这样的东西对你有用吗?
猜你喜欢
  • 2018-09-12
  • 1970-01-01
  • 2014-06-12
  • 1970-01-01
  • 2015-10-06
  • 2022-09-30
  • 1970-01-01
  • 2019-02-22
相关资源
最近更新 更多