Python 透视csv数据?
我是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 到目前为止,我掌
符号、日期、价格
苹果,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文件中的数据添加到该字典中,最后重写整个输出文件。