写入 CSV 时操纵 Pandas 输出

我正在尝试编写将执行以下操作的内容:


读取超过 1m 行和 100 列数据的 CSV;通过从最大数到最小数列出重复行的出现来总结每一列


到目前为止我所拥有的:



import pandas as pd


df = pd.read_csv (r'infile.csv')

outfile = ('outfile.csv')


for i in df:

    df.pivot_table(index=i, aggfunc='size').to_csv(outfile, mode='a')


此代码输出如下:


ColumnA,0

asdf,30

qwer,10

xyz,3

ColumnB,0

zxcv,50

jkl,8

我希望输出像这样在 excel 中打开:


ColumnA    ColumnB

asdf 30    zxcv 50

qwer 10    jkl  8

xyz  3

或者至少有这样的 CSV:


ColumnA

asdf,30

qwer,10

xyz,3


ColumnB

zxcv,50

jkl,8

我曾尝试在 for 循环中的每次迭代后写一个空行,但无论出于何种原因,空行总是全部添加到文件末尾 - 我认为这与 Pandas 将数据帧推送到 CSV 的方式有关?我不知道。


CSV 不使用相同的列标题,也不使用相同的行值,列或行的数量也不可靠地相同,因此它必须能够根据 CSV 包含的内容创建这些列表,而无需用户输入。


如果可能的话,我不反对在一次输出所有数据之前将每个数据子集添加到更大的数据帧中。


我是 Pandas 的新手,只是 Python 的初学者,所以我不知道什么是完成这项工作的最佳方法。


感谢您的帮助!


温温酱
浏览 157回答 2
2回答

哔哔one

这是一种让您非常接近所需 CSV 输出的方法:# create sample datafrom io import StringIOimport pandas as pddata = '''col_a, col_b, col_c10, 20, 3010, 21, 3110, 21, 3311, 22, 33'''df = pd.read_csv(StringIO(data), sep=', ', engine='python')print(df)   col_a  col_b  col_c0     10     20     301     10     21     312     10     21     333     11     22     33其次,用于unstack()重新塑造数据框(即,列标签变为行标签)。level=0并通过(原始列标签)计算值的数量:df = df.unstack().groupby(level=0).value_counts()col_a  10    3       11    1col_b  21    2       20    1       22    1col_c  33    2       30    1       31    1dtype: int64最后,重置索引(行标签),使列标签有意义,然后排序:df = (df.reset_index() .rename(columns={'level_0': 'orig_col', 'level_1': 'orig_value', 0: 'num_occur'}) .sort_values('orig_value') .sort_values('num_occur', ascending=False) .sort_values('orig_col'))print(df)  orig_col  orig_value  num_occur0    col_a          10          31    col_a          11          12    col_b          21          23    col_b          20          14    col_b          22          15    col_c          33          26    col_c          30          17    col_c          31          1您可以将最新版本的数据框写入 Excel。

慕标5832272

我假设一列中的值是单一类型,并且您可以在一列中包含字符串,在第二列中包含整数,等等。(如果这不正确,您可以将所有内容都转换为字符串并使用第一个响应).# create test data -- different type for each columnfrom io import StringIOimport pandas as pddata2 = '''col_a, col_b, col_c10, 'x', '2019-12-29'10, 'y', '2019-12-29'10, 'z', '2019-12-30'11, 'z', '2019-12-31''''df2 = pd.read_csv(StringIO(data2), sep=', ', engine='python', parse_dates=['col_c'])现在在每一列上使用value_counts(),并连接成一个宽表:results = list()for col in df2.columns:    s = (df2[col]         .value_counts()         .reset_index()         .rename(columns = {'index': 'value', col: 'count'}))    s.columns = pd.MultiIndex.from_product([[col], s.columns])    results.append(s)    results = pd.concat(results, axis=1)print(results)  col_a       col_b            col_c        value count value count      value count0  10.0   3.0   'z'     2 2019-12-29     21  11.0   1.0   'y'     1 2019-12-31     12   NaN   NaN   'x'     1 2019-12-30     1
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python