累计同一列数据值的计数作为单独的列

2024-09-30 06:27:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试获得一个特定的csv格式,以便其他代码可以正确读取它。我用Ordereddicts命令了它,但它花费了更长的时间,而且我的绘图代码给出了“StringIO()不带关键字参数”错误。虽然我认为我可以解决这个问题,但我还是喜欢使用value-uncounts方法,因为它更快。我得到了一个包含正确信息的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)  

输出:

^{pr2}$

每种发行类型的公司名称都重复。在

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

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只有设备错误呼叫,所以它没有将它们列为用户错误呼叫或两者都没有。不确定透视表是否能解释这一点。在


Tags: csv代码importpandasdata排序valueas
2条回答

本着StackOverflow的精神,下面是我如何解决我的问题。在

import numpy as np
import pandas as pd
import pandas.util.testing as tm; tm.N = 3

data = pd.DataFrame.from_csv('MYDATA.csv')
byqualityissue = data.groupby(["CompanyName","QualityIssue"]).size()
df = pd.DataFrame(byqualityissue)

formatted = df.unstack(level=-1)
formatted[np.isnan(formatted)] = 0
formatted.to_csv('byqualityissue.csv', header=True)

includingtotals = pd.concat([formatted,pd.DataFrame(formatted.sum(axis=1),columns=['Total'])],axis=1)
sorted = includingtotals.sort_index(by=['Total'], ascending=[False])

我使用unstack重新组织数据,用0替换NaN值,将所有行相加,并用这些值附加一个新列,然后进行排序。在

在中读取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

相关问题 更多 >

    热门问题