Python 透视csv数据?

Python 透视csv数据?,python,python-3.x,csv,pivot,Python,Python 3.x,Csv,Pivot,我是Python新手,如果这很容易,请原谅。我有一个csv文件,其中包含以下数据: 符号、日期、价格 苹果,2016年12月23日,50 苹果,2016年12月26日,51 苹果,2016年12月27日,52 谷歌,23/12/2016,70 谷歌,2016年12月26日,71 谷歌,27/12/2016,72 我需要编写一个新的csv文件,如下所示: Date,苹果,谷歌 23/12/2016,50,70 26/12/2016,51,71 27/12/2016,52,72 到目前为止,我掌

我是Python新手,如果这很容易,请原谅。我有一个csv文件,其中包含以下数据:

符号、日期、价格
苹果,2016年12月23日,50
苹果,2016年12月26日,51
苹果,2016年12月27日,52
谷歌,23/12/2016,70
谷歌,2016年12月26日,71
谷歌,27/12/2016,72
我需要编写一个新的csv文件,如下所示:

Date,苹果,谷歌
23/12/2016,50,70
26/12/2016,51,71
27/12/2016,52,72
到目前为止,我掌握的代码如下。然而,我似乎无法将符号作为列来表示

import csv
import os

csv.register_dialect(
    'mydialect',
    delimiter =',',
    )

symbol, date=[],[]

with open('EB_CUT2.csv',"rt") as dfile:
    thedata = csv.reader(dfile, dialect ='mydialect')
    for row in thedata:
        if row[4] not in date:
            date.append(row[4])
        if row[0] not in symbol:
            symbol.append(row[0])
dfile.close()

ebout = open('EB_CUT.csv',"wt",newline='')
wr = csv.writer(ebout)
for val in date:
    wr.writerow([val])
ebout.close()
解决方案:

import pandas 

df = pd.read_csv('EB_CUT2.csv', index_col=1, parse_dates=True)
df2 = pd.pivot_table(df, values='price', columns=['Symbol'], index=df.index)
df2.to_csv('EB_CUT.csv')
import csv
from datetime import datetime
import os

MY_DIALECT = 'mydialect'
csv.register_dialect(MY_DIALECT, delimiter =',', skipinitialspace=True,)

daily_prices = {}
with open('EB_CUT2.csv', "rt", newline='') as dfile:
    reader = csv.DictReader(dfile, dialect=MY_DIALECT)
    for row in reader:
        date = datetime.date(datetime.strptime(row['date'], '%d/%m/%Y'))
        entry = daily_prices.setdefault(date, {})
        entry[row['Symbol']] = row['price']

all_symbols = sorted(
    set(symbol for value in daily_prices.values() for symbol in value))

with open('EB_CUT.csv', "wt", newline='') as ebout:
    writer = csv.writer(ebout)
    writer.writerow(['Date'] + all_symbols) # header
    for date, prices in sorted(daily_prices.items()):
        row = [date.strftime('%d/%m/%Y')]
        for symbol in all_symbols:
            row.append(prices.get(symbol, ''))
        writer.writerow(row)
EB_CUT.csv的内容

date,apple,google
2016-12-23,50,70
2016-12-26,51,71
2016-12-27,52,72
非冲突解决方案:

import pandas 

df = pd.read_csv('EB_CUT2.csv', index_col=1, parse_dates=True)
df2 = pd.pivot_table(df, values='price', columns=['Symbol'], index=df.index)
df2.to_csv('EB_CUT.csv')
import csv
from datetime import datetime
import os

MY_DIALECT = 'mydialect'
csv.register_dialect(MY_DIALECT, delimiter =',', skipinitialspace=True,)

daily_prices = {}
with open('EB_CUT2.csv', "rt", newline='') as dfile:
    reader = csv.DictReader(dfile, dialect=MY_DIALECT)
    for row in reader:
        date = datetime.date(datetime.strptime(row['date'], '%d/%m/%Y'))
        entry = daily_prices.setdefault(date, {})
        entry[row['Symbol']] = row['price']

all_symbols = sorted(
    set(symbol for value in daily_prices.values() for symbol in value))

with open('EB_CUT.csv', "wt", newline='') as ebout:
    writer = csv.writer(ebout)
    writer.writerow(['Date'] + all_symbols) # header
    for date, prices in sorted(daily_prices.items()):
        row = [date.strftime('%d/%m/%Y')]
        for symbol in all_symbols:
            row.append(prices.get(symbol, ''))
        writer.writerow(row)
如果您想从任何现有的
'EB_CUT.csv'
文件中初始化
每日价格
字典,实际上与上面显示的最后一步相反,您可能会从下面的评论中了解到以后要合并到更多的csv文件,下面的代码可以做到这一点:

daily_prices = {}
if os.path.isfile('EB_CUT.csv'):  # existing file?
    # Initialize daily_prices from existing csv file.
    with open('EB_CUT.csv', "rt", newline='') as inf:
        reader = csv.reader(inf)
        next(reader)  # skip header row
        for row in reader:
            date = datetime.date(datetime.strptime(row[0], '%d/%m/%Y'))
            days_prices = daily_prices.setdefault(date, {})
            for symbol, price in row[1:]:
                days_prices[symbol] = price

除读取当前csv文件进行初始化外,另一种方法是始终将与当前csv文件相对应的
每日价格
数据以您选择的任何格式保存在单独的文件中。通过使用
pickle
json
模块,可以非常轻松地编写和读回该文件。

请格式化您的csv文件,这样我们可以帮助您更好地完成这类工作。这不是转置。转置意味着交换行和列,这样如果你有一个
NxM
矩阵,你就会得到
MxN
。在您的示例中,一些列已消失。您的输出没有意义。谢谢,是的,看起来熊猫是一种方式,我们将检查它。非常感谢您的帮助,效果非常好。我现在只需要添加它,以便对于任何新的日期或符号,它会附加到输出文件中,因为我将在第一步中有多个csv,但我会看看我是否能解决这个问题。我的Pandas解决方案不起作用,因为我有很多Pandas错误,可能它没有正确安装在我的电脑上。再次感谢您不客气。要将数据附加到输出文件中,首先从文件中当前的内容初始化
每日价格
字典(而不是像我的回答中所示的那样以空字典开始),然后将一个或多个csv文件中的数据添加到该字典中,最后重写整个输出文件。