首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用pandas库将长行转换为长列

使用pandas库将长行转换为长列
EN

Stack Overflow用户
提问于 2019-09-05 00:26:15
回答 2查看 138关注 0票数 0

我刚开始使用Pandas,但是我有一个问题,我希望这个问题对熟悉Pandas的经验丰富的Python开发人员有意义。

我正在使用Python Pandas库从Microsoft Excel读取csv文件,其中的数据被组织成长行。每行的开头包含一个日期,后跟测量值的后续值:

代码语言:javascript
复制
Date        A1             A2              A3               A1001
1/1/2000, measurement 1, measurement 2, measurement 3, to measurement 1000. 

我希望将每一行转换为三个新列,包括一个“日期”列、一个“数据”列和一个“位置”列,这三个列将暂时保留为空。

一旦1月1日完成,它将在1/2/2000重新开始。我知道,这些将是非常长的列。我需要它以这种方式上传到数据库,而不是令人难以置信的冗长的行。

所有这些都将被写入一个新的csv文件,该文件是从原始文件转置而来的。

我尝试使用“iloc”选择第一行。我不太确定从这里到哪里去。

谢谢你的帮助。

下面的代码是我尝试在对所有行进行格式化之前只格式化一行的代码。

代码语言:javascript
复制
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个带有数值测量的单元。

我希望三个列看起来像这样,而不是在一行上有一个日期以及与之关联的所有值:

代码语言:javascript
复制
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

以此类推。

EN

回答 2

Stack Overflow用户

发布于 2019-09-05 01:38:33

获得所需内容的最简单方法是将日期设置为索引,并使用.unstack()将列转换为行:

代码语言:javascript
复制
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()返回一个自动编号的索引

代码语言:javascript
复制
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]
票数 2
EN

Stack Overflow用户

发布于 2019-09-05 00:36:18

代码语言:javascript
复制
# 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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57792457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档