【问题标题】:rearrange CSV columns重新排列 CSV 列
【发布时间】:2017-10-18 15:12:00
【问题描述】:

当创建 CSV 文件时,列并没有像我希望的那样位于正确的位置。例如,列“Period”(变量为“RD”)是文件中的第二列等。

有没有办法将每列的位置设置为我想要的位置?

我的代码:

from datetime import datetime
from elasticsearch import Elasticsearch
import csv

es = Elasticsearch(["9200"])


res = es.search(index="search", body=
                {
                    "_source": ["VT","NCR","N","DT","RD"],
                    "query": {

                        "bool": {
                            "must": [{"range": {"VT": {
                                            "gte": "now/d",
                                            "lte": "now+1d/d"}}},

                                {"wildcard": {"user": "mike*"}}]}}},size=10)


csv_file = 'File_' + str(datetime.now().strftime('%Y_%m_%d - %H.%M.%S')) + '.csv'


header_names = { 'VT': 'Date', 'NCR': 'ExTime', 'N': 'Name', 'DT': 'Party', ' RD ': 'Period'}



with open(csv_file, 'w', newline='') as f:
    header_present  = False
    for doc in res['hits']['hits']:
        my_dict = doc['_source']
        if not header_present:
            w = csv.DictWriter(f, my_dict.keys())
            w.writerow(header_names,) 
            header_present = True
             w.writerow(my_dict)

【问题讨论】:

  • 这样不行,我试过了
  • @RomanPerekhrest 这是一个 Elasticsearch 列表,而不是 Python 列表。结果是 JSON,因此不保留顺序

标签: python python-3.x csv python-3.6


【解决方案1】:

使用 pandas 非常简单:

import pandas as pd


# Read csv / tab-delimited in this example
df = pd.read_csv('example.csv', sep='\t')

print df

   A  B  C
0  4  5  9
1  4  5  9
2  4  5  9
3  4  5  9

# Reorder columns
df = df[['C', 'A', 'B']]

print df

   C  A  B
0  9  4  5
1  9  4  5
2  9  4  5
3  9  4  5

# Write csv / tab-delimited
df.to_csv('example.csv', sep='\t')

【讨论】:

  • 请记住,我的 CSV 文件名是使用当前日期和时间戳生成的
  • @Rich 文件名与列重新排序无关 - 您可以在编写后将 CSV 加载到 Pandas 中。
【解决方案2】:

字典没有排序,如果你想强制列排序,你需要明确指定

import csv
headers = ['Party', 'Period', 'Date', 'ExTime', 'Name'] # Don't use my_dict.keys()
with open('header.csv', 'w') as f:
    w = csv.DictWriter(f, fieldnames=headers)
    w.writeheader()

$ python sample.py && cat header.csv
Party,Period,Date,ExTime,Name

并且当你调用w.writerow(my_dict) 时,字典会根据标题进行排序。

row = {'Period':2, 'Date':3, 'Name':5, 'Party': 1, 'ExTime':4}
w.writerow(row)

输出

Party,Period,Date,ExTime,Name
1,2,3,4,5

【讨论】:

  • 我试过你的建议,没用。我想你需要告诉我如何使用我的代码。如果你不介意
  • “没用”怎么办?错误?不确定这个答案值得否决
  • 您上面的代码也没有获取与我相同的 CSV 文件名。我拥有的文件名是由当前日期和时间生成的。
  • 这会和我的 header_names 和它背后的数据冲突吗?
  • 关于文件名,你已经有了csv_file作为字符串。只需使用它而不是'header.csv'。你有这个问题吗?
【解决方案3】:

当您处理 csv 文件时,最好将 pandas 用于您的应用程序。

import pandas as pd

# Let your file have 4 columns named c1, c2, c3 and c4
# And assume you want to reorder it to c2, c3, c1, c4

data_frame = pd.read_csv('filename.csv', delimiter=',') # reading csv file as data frame with pandas

new_data_frame = data_frame[['c2', 'c3', 'c1', 'c4']] # reordered the dataframe and stored in new_data_frame

# If you want to save the result to new csv file

new_data_frame.to_csv('altered.csv', index=None)

在您的情况下,假设列和分隔符的顺序是“,”

import pandas as pd

csv_file_name = 'File_' + str(datetime.now().strftime('%Y_%m_%d - %H.%M.%S')) + '.csv'

data_frame = pd.read_csv(csv_file_name, delimiter=',') # change delimiter to '\t' if needed

new_data_frame = data_frame[['Party', 'Period', 'Date', 'ExTime', 'Name']]

new_data_frame.to_csv('filename.csv', index=None)

【讨论】:

  • 如何在上面的代码中使用它?你能给我看看吗
  • 你的 csv 中的列标题是什么?你想要什么顺序?
  • 它们列在我的代码中。所以在我的代码中你可以看到标题名称 - header_names = { 'VT': 'Date', 'NCR': 'ExTime', 'N': 'Name', 'DT': 'Party', 'RD' : '时期'}。所以这些列是日期、ExTime、姓名和派对,我有更多,但如果你告诉我如何做到这一点,那就太好了。请记住,我的 CSV 文件名是一个固定名称,因为它会获取当前日期和时间。
  • 您真正希望更改列的顺序是什么?
  • 例如,“派对”、“期间”、“日期”。 'ExTime','名称'
【解决方案4】:
import pandas as pd

df  = pd.read_csv('pokemon_data.csv')`enter code here`
'Name', 'Type 1', 'Type 2', 'HP', 'Attack', 'Defense', 'Sp. Atk','Sp. Def', 'Speed', 'Generation', 'Legendary'

(我的数据框由相同顺序的相同列名组成)

df['Total']=df.iloc[:,4:10].sum(axis=1)
`'Name', 'Type 1', 'Type 2', 'HP', 'Attack', 'Defense', 'Sp. Atk','Sp. Def', 'Speed', 'Generation', 'Legendary', 'Total'`

(添加一个新列 Total 是 hp、attack、defence、sp.atk、sp.def、speed 的总和)

cols = list(df.columns.values)
df = df[cols[0:4]+[cols[-1]]+cols[4:12]]
'Name', 'Type 1', 'Type 2','Total', 'HP', 'Attack', 'Defense', 'Sp. Atk','Sp. Def', 'Speed', 'Generation', 'Legendary'

(移动“总计”列)

【讨论】:

  • 请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。
猜你喜欢
  • 2015-08-28
  • 2015-06-20
  • 2016-10-26
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 2022-11-04
相关资源
最近更新 更多