python - 将列数据值的计数累积为单独的列

标签 python csv pandas

我正在尝试获取特定格式的 csv,以便其他代码可以正确读取它。我已经使用 Ordereddicts 订购了它,但需要更长的时间,并且我的绘图代码给出了“StringIO() 不接受关键字参数”错误。虽然我认为我可以解决这个问题,但无论如何我更喜欢我的 value_counts 方法,因为它要快得多。我得到一个包含正确信息的 csv 文件,下一步我需要的只是格式化。我已经查找了有关类似问题的多个线程,但没有查找如何以这种特定方式进行排序。

我的代码:

import csv
import numpy as np
import pandas as pd
from collections import defaultdict, Counter
import pandas.util.testing as tm; tm.N = 3

data = pd.DataFrame.from_csv('MYDATA.csv')

data[['QualityIssue','CompanyName']]
data['QualityIssue'].value_counts()
RatedCustomerCallers = data['CompanyName'].value_counts()
TopCustomerCallers = RatedCustomerCallers[0:18]
print(TopCustomerCallers)

TopCustomerCallers.to_csv('topcustomercallerslist.csv')

byqualityissue = data.groupby(["CompanyName","QualityIssue"]).size()
print byqualityissue
byqualityissue.to_csv('byqualityissue.csv', header=True)  

输出:

CompanyName,     QualityIssue,        0
Company 1,       Equipment Error,     15
Company 2,       User Error,          1
Company 2,       Equipment Error,     5
Company 3,       Equipment Error,     3
Company 3,       User Error,          10
Company 3,       Neither,             13

每种类型的问题都会重复公司名称。

但是,我希望它按主要调用客户(添加的设备数、用户数、无调用数)进行排序并以这种方式显示:

Top Calling Customers,         Equipment,    User,    Neither,
Company 3,                      3,           10,        13,
Company 1,                      15,           0,        0,
Customer 2,                      5,           1,        0,

我尝试使用数据透视表

df = pd.DataFrame(byqualityissue)
df.pivot(index='CompanyName', columns='QualityIssue', values='0')

但是它给了我 KeyError: '0' 这很奇怪,因为我把它作为值的输入。另外,我不确定它是否会起作用,因为每个客户的输出只是他们调用的类型。例如,公司 1 只有设备错误调用,因此它不会列出“用户错误”或“两者都没有”调用。不确定数据透视表是否可以解释这一点。

最佳答案

读入您的 CSV 文件。按公司和质量问题对其进行索引,然后在质量问题上将其取消堆叠。最后,替换由于未找到匹配数据而出现的 Nan

In [341]: d1
Out[341]:
    Company Name Quality Issue  Cases
0         Co 1     Equipment     15
1         Co 2          User      1
2         Co 2     Equipment      5
3         Co 3     Equipment      3
4         Co 3          User     10
5         Co 3       Neither     13

In [342]: d2 = d1.set_index(["Company Name", "Quality Issue"])

In [343]: d2
Out[343]:
                        Cases
Company Name Quality Issue
Co 1         Equipment         15
Co 2         User               1
             Equipment          5
Co 3         Equipment          3
             User              10
             Neither           13

In [344]: d3 = d2.unstack("Quality Issue")

In [345]: d3.fillna(0)
Out[345]:
    Cases
Quality Issue  Equipment  Neither  User
Company Name
Co 1                  15        0     0
Co 2                   5        0     1
Co 3                   3       13    10

关于python - 将列数据值的计数累积为单独的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30713756/

相关文章:

python - 设置 hvplots 的默认选项

java - 创建 CSV 并以 byte[] 形式返回,以便在 Spring Controller 中下载

python - csv.reader 从请求流 : iterator should return strings, 中读取而不是字节

python - 合并 Pandas 中的 2 个数据帧 : join on some columns, 总结其他

python - 使用 REST 的 Google 日历 API - 每个身份验证只有一个请求?

python - 在两个 kivy 屏幕中添加两个值并得到结果

python - 删除不在集合中的字典条目

CSV 与 TXT 文件中的 Java BufferedReader 行为

python - Pandas :实现组操作的 'built-in' 方法(例如均值、标准值)的速度

python - 如何迭代数据框列