簡體   English   中英

將數據框拆分為單獨的CSV文件

[英]Splitting a dataframe into separate CSV files

我有一個相當大的csv,看起來像這樣:

+---------+---------+
| Column1 | Column2 |
+---------+---------+
|       1 |   93644 |
|       2 |   63246 |
|       3 |   47790 |
|       3 |   39644 |
|       3 |   32585 |
|       1 |   19593 |
|       1 |   12707 |
|       2 |   53480 |
+---------+---------+

我的意圖是

  1. 添加新列
  2. 在csv的每一行上,將特定值插入該列“ NewColumnValue”
  3. 根據Column1中的值對文件進行排序
  4. 根據“ Column1”的內容將原始CSV拆分為新文件,並刪除標題

例如,我想得到多個看起來像這樣的文件:

+---+-------+----------------+
| 1 | 19593 | NewColumnValue |
| 1 | 93644 | NewColumnValue |
| 1 | 12707 | NewColumnValue |
+---+-------+----------------+

+---+-------+-----------------+
| 2 | 63246 | NewColumnValue |
| 2 | 53480 | NewColumnValue |
+---+-------+-----------------+

+---+-------+-----------------+
| 3 | 47790 | NewColumnValue |
| 3 | 39644 | NewColumnValue |
| 3 | 32585 | NewColumnValue |
+---+-------+-----------------+

我設法使用單獨的.py文件來做到這一點:

第1步

# -*- coding: utf-8 -*-
import pandas as pd
df = pd.read_csv('source.csv')
df = df.sort_values('Column1')
df['NewColumn'] = 'NewColumnValue'
df.to_csv('ready.csv', index=False, header=False)

第2步

import csv
from itertools import groupby
for key, rows in groupby(csv.reader(open("ready.csv")),
                         lambda row: row[0]):
    with open("%s.csv" % key, "w") as output:
        for row in rows:
            output.write(",".join(row) + "\n")

但我真的很想學習如何在單個.py文件中完成所有操作。 我嘗試了這個:

# -*- coding: utf-8 -*-
#This processes a large CSV file.  
#It will dd a new column, populate the new column with a uniform piece of data for each row, sort the CSV, and remove headers
#Then it will split the single large CSV into multiple CSVs based on the value in column 0 
import pandas as pd
import csv
from itertools import groupby
df = pd.read_csv('source.csv')
df = df.sort_values('Column1')
df['NewColumn'] = 'NewColumnValue'
for key, rows in groupby(csv.reader((df)),
                         lambda row: row[0]):
    with open("%s.csv" % key, "w") as output:
        for row in rows:
            output.write(",".join(row) + "\n")

但是卻沒有按預期工作,而是給我多個以每個列標題命名的CSV。

發生這種情況是因為我在使用單獨的.py文件時刪除了標題行,而我不在這里這樣做嗎? 我不確定在拆分文件以刪除標題時需要執行什么操作。

為什么不只按Column1分組並保存每個組?

df = df.sort_values('Column1').assign(NewColumn='NewColumnValue')
print(df)

   Column1  Column2       NewColumn
0        1    93644  NewColumnValue
5        1    19593  NewColumnValue
6        1    12707  NewColumnValue
1        2    63246  NewColumnValue
7        2    53480  NewColumnValue
2        3    47790  NewColumnValue
3        3    39644  NewColumnValue
4        3    32585  NewColumnValue

for i, g in df.groupby('Column1'):
    g.to_csv('{}.csv'.format(i), header=False, index_label=False)

感謝Unatiel的改進 header=False將不寫標題,而index_label=False將不寫索引列。

這將創建3個文件:

1.csv
2.csv
3.csv

每個具有與每個Column1組相對應的數據。

您無需切換到itertools進行過濾, pandas內置了所有必需的功能。

# -*- coding: utf-8 -*-
import pandas as pd
df = pd.read_csv('source.csv')
df = df.sort_values('Column1')  # Sorting isn't needed
df['NewColumn'] = 'NewColumnValue'
for key in df['Column1'].unique():  # For each value in Column1
    # These two steps can be combined into a single call
    # I'll separate for clarity:  
    # 1) filter the dataframe on the unique value
    dw = df[df['Column1']==key]   
    # 2) write the resulting dataframe without headers
    dw.to_csv("%s.csv" % key, header=False)  

pandas.DataFrame支持一種將其數據作為csv to_csv()寫入的方法。 在這種情況下,您不需要csv模塊。

import pandas as pd

df = pd.read_csv('source.csv')
df = df.sort_values('Column1').set_index('Column1')
df['NewColumn'] = 'NewColumnValue'
for key in df.index.unique():
    df.loc[key].to_csv('%d.csv' % int(key), header=False)

for key df.index.unique():將遍歷索引中的每個唯一值。 在您的示例中,它將循環(1, 2 , 3) header=False確保標頭未寫入輸出文件。

為了解釋為什么在示例中輸出錯誤,請嘗試使用print(list(df)) 這應該輸出df中的所有列。 這就是為什么for key, rows in csv.reader((df)):遍歷df中的列。

實際上,您應該為數據框中的每一列獲取1個csv,它們的內容可能類似於,[NAME_OF_COLUMN]或也許,<itertools.... object at 0x.....>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM