python: 将数据帧groupby写入文件

python: write a dataframe groupby to a file

我有一个包含以下内容的文件,我正在阅读 python

Item Master Primary Spec/Common Information/Contract Number||Contract Master Primary Spec/cage code
8AND3||SP47W117D0015
8AND3||SP47W117D0015
8AND3||SP47W117D0015
8AND3||SP47W117D0015
8AND3||SP47W117D0015
8C1C2||N6247820D2401
8C1C2||N6247820D2401
8C1C2||N6247820D2401

我正在尝试统计合同数量。下面的代码在我打印时似乎有效(尽管 header 列由于某种原因被颠倒了),但当我尝试将其输出到文件时却无效。

import pandas as pd

fname="mdm.export.item.master.delta.1335.20220120011500_125_125.csv"
fdir="./data/"
df = pd.read_csv(fdir+fname, sep='\|\|', keep_default_na=False, engine='python')

uniqContract=df.groupby(['Item Master Primary Spec/Common Information/Contract Number']).count()
print(uniqContract)

file = open("testfile.txt","w") 
for items in uniqContract:
    file.writelines(items+'\n')
file.close() 

这是打印输出

(base) PS D:-MyLocalFiles> python .\helloworld.py
Contract Master Primary Spec/cage code Item Master Primary Spec/Common Information/Con...
8AND3                                                                                    5
8C1C2                                                                                    3
(base) PS D:-MyLocalFiles\python\backlog_report>

但这是文件的输出

Contract Master Primary Spec/cage code

我做错了什么?

uniqContract 是一个数据框,当您遍历数据框时,它会遍历数据框列。 uniqContract 看起来像这样:

                                                    Contract Master Primary Spec/cage code
Item Master Primary Spec/Common Information/Con...                                        
8AND3                                                                                    5
8C1C2                                                                                    3

...只有一列,所以这就是为什么您在文件中得到 Contract Master Primary Spec/cage code

uniqContract=df.groupby(['Item Master Primary Spec/Common Information/Contract Number']).count().reset_index()
uniqContract.to_csv('testfile.txt', delimiter='\t')

您可以在 groupby 计数聚合上调用 .reset_index(),然后将其直接写入(文本)csv 文件。您可以指定分隔符(这是制表符)。

因为您正在使用 pandas.dataFrame read_csv

在没有索引列的情况下使用 pandas.dataFrame to_csv,这样您就不会为每一行都获得额外的 ID。

uniqContract.to_csv("testfile.csv", index=False)

A link https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_csv.html

的文档