将数据帧写入具有特殊要求的csv文件

时间:2017-08-08 10:02:46

标签: python csv

我是python的初学者。

我需要将列表转换为具有特殊要求的CSV文件。

我有一个这样的清单:

protected void savesubmit_Click(object sender, EventArgs e)
{

    SqlConnection con = new SqlConnection(@"Data Source=.;Initial Catalog=Khayati;Integrated Security=True");
    string qu = string.Format("insert into Ordertb (nokar,modeledokht,tozihat,username) values('{0}','{1}',N'{2}', '{3}')", DropDownList1.Text, DropDownList2.Text, tozihtxt.Text, Convert.ToString(Session["username1"]));
    SqlDataAdapter da = new SqlDataAdapter(qu, con);
    DataSet ds = new DataSet();
    da.Fill(ds, "ordertbl");

}

我希望将其写入(导出)到ONE csv文件。我的意思是,像这样:

text1 = [('CIF', '48752614P'), ('BILL', '87451,45')]
text2 = [('CLIENT', 'JOHN'), ('MONEY', '450'), ('HOUSE','2541')]
text3 = [('NAME', 'MERY'), ('CIF', ['47852361N','4587563O'])]

我做了什么? 首先,我将列表放入数据框,然后将其写入csv_file:

text1   CIF         BILL
        48752614P   87451,45
text2   CLIENT      MONEY       HOUSE
        JOHN        450         2541
text3   NAME        CIF
        MERY        [47852361N, 4587563O]

所以,我的问题是我想只在一个CSV文件中写下所有这些文件。

我想:

text_files = [text1, text2, text3]
df_results = []

for file in text_files:
   df_results = pd.DataFrame(file)
   df_results = df_results.T
   df_results.to_csv((str(file) + '.csv'), sep=';', encoding='utf-8', index=False, quotechar=' ', header=False)

我一直在寻找,但我找不到如何解决这个问题。

谢谢,

MARCUS

3 个答案:

答案 0 :(得分:1)

这就是你要找的 -

import pandas as pd

text1 = [('CIF', '48752614P'), ('BILL', '87451,45')]
text2 = [('CLIENT', 'JOHN'), ('MONEY', '450'), ('HOUSE','2541')]
text3 = [('NAME', 'MERY'), ('CIF', ['47852361N','4587563O'])]

col_num = max([len(text) for text in texts])

texts = [text1,text2,text3]
for text in texts:
    if len(text) < col_num:
        text.extend([(None,None)*(col_num-len(text))])

col_values = [[] for i in range(col_num)]
[col_values[i].extend([text[i][0],text[i][1]]) for text in texts for i in range(len(text))]
df = pd.DataFrame(col_values).T
df.fillna('')
df.index = ['text1','text1','text2','text2','text3','text3']
df.to_csv('output.csv')

答案 1 :(得分:1)

正如我在评论中建议的那样,您不需要数据帧。 更新了;并且在复制后跳过第一列。

text1 = [('CIF', '48752614P'), ('BILL', '87451,45')]
text2 = [('CLIENT', 'JOHN'), ('MONEY', '450'), ('HOUSE','2541')]
text3 = [('NAME', 'MERY'), ('CIF', ['47852361N','4587563O'])]

with open("output.csv", "w") as f:
    for ind, item in enumerate([text1,text2,text3]):
        for ind2, subitem in enumerate(item):
            if ind2 == 0:
                outstring = "text{};{}".format(str(ind+1),(';'.join([str(i) for i in subitem])))
            else:
                outstring = ";{}".format((';'.join([str(i) for i in subitem])))
            f.write(outstring)
            print(outstring)

输出:

text1;CIF;48752614P
;BILL;87451,45
text2;CLIENT;JOHN
;MONEY;450
;HOUSE;2541
text3;NAME;MERY
;CIF;['47852361N', '4587563O']

答案 2 :(得分:1)

要将数据组织到所需的结构中,需要完成两个步骤:
1)通过索引将每个教学列表压缩 - 将[(a,b),(a&#39;,b&#39;)]转换为[(a,a&#39;),(b,b&#39;) ] - 代码中的第一行。
2)迭代所有列表(在原始问题[text1,text2,text3]中)并将所有压缩的tupels作为一个平面列表及其相关的原始文本索引。代码中的第二行。

这使得将数据放入数据框并导出简单。第三和第四行代码。

one_text = lambda text: [x for x in zip(*text)]
data_for_df = [ [i] + list(text) for i in range(0, len(all_texts)) for text in one_text(all_texts[i])]
df = pd.DataFrame(data_for_df, columns=['text_name', 'col1', 'col2'])
df.to_csv(target_file)