我刚开始使用Pandas,但是我有一个问题,我希望这个问题对熟悉Pandas的经验丰富的Python开发人员有意义。
我正在使用Python Pandas库从Microsoft Excel读取csv文件,其中的数据被组织成长行。每行的开头包含一个日期,后跟测量值的后续值:
Date A1 A2 A3 A1001
1/1/2000, measurement 1, measurement 2, measurement 3, to measurement 1000. 我希望将每一行转换为三个新列,包括一个“日期”列、一个“数据”列和一个“位置”列,这三个列将暂时保留为空。
一旦1月1日完成,它将在1/2/2000重新开始。我知道,这些将是非常长的列。我需要它以这种方式上传到数据库,而不是令人难以置信的冗长的行。
所有这些都将被写入一个新的csv文件,该文件是从原始文件转置而来的。
我尝试使用“iloc”选择第一行。我不太确定从这里到哪里去。
谢谢你的帮助。
下面的代码是我尝试在对所有行进行格式化之前只格式化一行的代码。
df = pd.read_csv('csv_file')
#select individual row
first_row = df.iloc[0]
#convert to dataframe
first_row = pd.DataFrame(data=df.iloc[0])
#transpose?
first_row.stack()
#test the output
print(first_row)
#reformatted_df.to_csv('csv_output_file')每行包含1000个带有数值测量的单元。
我希望三个列看起来像这样,而不是在一行上有一个日期以及与之关联的所有值:
Date Data Location
1/1/2000 Measurement 1...
1/1/2000 Measurement 2...
1/1/2000 Measurement 3...
1/1/2000 Measurement 1000
etc.
The column continues for 1/2/2000:
Date Data Location
1/2/2000 Measurement 1...
1/2/2000 Measurement 2...
1/2/2000 Measurement 3...
1/2/2000 Measurement 1000以此类推。
发布于 2019-09-05 01:38:33
获得所需内容的最简单方法是将日期设置为索引,并使用.unstack()将列转换为行:
In [42]: d = {'date': ['2000-01-01', '2000-01-02', '2000-01-03']}
In [43]: for i in range(1, 1001):
...: d['A{:03}'.format(i)] = ['measurement {}'.format(i)] * 3
...:
In [44]: df = pd.DataFrame(d)
In [45]: df
Out[45]:
date A001 A002 ... A998 A999 A1000
0 2000-01-01 measurement 1 measurement 2 ... measurement 998 measurement 999 measurement 1000
1 2000-01-02 measurement 1 measurement 2 ... measurement 998 measurement 999 measurement 1000
2 2000-01-03 measurement 1 measurement 2 ... measurement 998 measurement 999 measurement 1000
[3 rows x 1001 columns]
In [46]: long_df = df.set_index('date').unstack().to_frame('Data').swaplevel().sort_index()
In [47]: long_df['Location'] = None
In [48]: long_df
Out[48]:
Data Location
date
2000-01-01 A001 measurement 1 None
A002 measurement 2 None
A003 measurement 3 None
A004 measurement 4 None
A005 measurement 5 None
... ... ...
2000-01-03 A995 measurement 995 None
A996 measurement 996 None
A997 measurement 997 None
A998 measurement 998 None
A999 measurement 999 None
[3000 rows x 2 columns]然后,您可以去掉旧的列名,并使用reset_index()和drop()返回一个自动编号的索引
In [49]: long_df.reset_index().drop(columns=['level_1'])
Out[49]:
date Data Location
0 2000-01-01 measurement 1 None
1 2000-01-01 measurement 2 None
2 2000-01-01 measurement 3 None
3 2000-01-01 measurement 4 None
4 2000-01-01 measurement 5 None
... ... ... ...
2995 2000-01-03 measurement 995 None
2996 2000-01-03 measurement 996 None
2997 2000-01-03 measurement 997 None
2998 2000-01-03 measurement 998 None
2999 2000-01-03 measurement 999 None
[3000 rows x 3 columns]发布于 2019-09-05 00:36:18
# read the data
df = pd.read_csv('csv_file')
# transpose date and data
new_df = df.transpose()
# rename the column names
new_df.columns = ['Date', 'Data']
# now if you want to add a new column called location and keep it blank
new_df['location'] = new_df.apply(lambda x:"" , axis=1)https://stackoverflow.com/questions/57792457
复制相似问题