为了账号安全,请及时绑定邮箱和手机立即绑定

写入 CSV 时操纵 Pandas 输出

写入 CSV 时操纵 Pandas 输出

温温酱 2023-06-20 17:26:44
我正在尝试编写将执行以下操作的内容:读取超过 1m 行和 100 列数据的 CSV;通过从最大数到最小数列出重复行的出现来总结每一列到目前为止我所拥有的:import pandas as pddf = 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,0asdf,30qwer,10xyz,3ColumnB,0zxcv,50jkl,8我希望输出像这样在 excel 中打开:ColumnA    ColumnBasdf 30    zxcv 50qwer 10    jkl  8xyz  3或者至少有这样的 CSV:ColumnAasdf,30qwer,10xyz,3ColumnBzxcv,50jkl,8我曾尝试在 for 循环中的每次迭代后写一个空行,但无论出于何种原因,空行总是全部添加到文件末尾 - 我认为这与 Pandas 将数据帧推送到 CSV 的方式有关?我不知道。CSV 不使用相同的列标题,也不使用相同的行值,列或行的数量也不可靠地相同,因此它必须能够根据 CSV 包含的内容创建这些列表,而无需用户输入。如果可能的话,我不反对在一次输出所有数据之前将每个数据子集添加到更大的数据帧中。我是 Pandas 的新手,只是 Python 的初学者,所以我不知道什么是完成这项工作的最佳方法。感谢您的帮助!
查看完整描述

2 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

这是一种让您非常接近所需 CSV 输出的方法:


# create sample data

from io import StringIO

import pandas as pd


data = '''col_a, col_b, col_c

10, 20, 30

10, 21, 31

10, 21, 33

11, 22, 33

'''

df = pd.read_csv(StringIO(data), sep=', ', engine='python')

print(df)


   col_a  col_b  col_c

0     10     20     30

1     10     21     31

2     10     21     33

3     11     22     33

其次,用于unstack()重新塑造数据框(即,列标签变为行标签)。level=0并通过(原始列标签)计算值的数量:


df = df.unstack().groupby(level=0).value_counts()


col_a  10    3

       11    1

col_b  21    2

       20    1

       22    1

col_c  33    2

       30    1

       31    1

dtype: 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_occur

0    col_a          10          3

1    col_a          11          1

2    col_b          21          2

3    col_b          20          1

4    col_b          22          1

5    col_c          33          2

6    col_c          30          1

7    col_c          31          1

您可以将最新版本的数据框写入 Excel。


查看完整回答
反对 回复 2023-06-20
?
慕标5832272

TA贡献1966条经验 获得超4个赞

我假设一列中的值是单一类型,并且您可以在一列中包含字符串,在第二列中包含整数,等等。(如果这不正确,您可以将所有内容都转换为字符串并使用第一个响应).


# create test data -- different type for each column

from io import StringIO

import pandas as pd


data2 = '''col_a, col_b, col_c

10, '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 count

0  10.0   3.0   'z'     2 2019-12-29     2

1  11.0   1.0   'y'     1 2019-12-31     1

2   NaN   NaN   'x'     1 2019-12-30     1


查看完整回答
反对 回复 2023-06-20
  • 2 回答
  • 0 关注
  • 156 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号