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

2024-04-19 07:48:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我对使用Pandas还比较陌生,但是我有一个问题,我希望对于熟悉Pandas的经验丰富的Python开发人员来说是有意义的。你知道吗

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

Date        A1             A2              A3               A1001
1/1/2000, measurement 1, measurement 2, measurement 3, to measurement 1000. 

我想把每一行转换成三个新的列,其中包括一个“日期”列、“数据”列和一个“位置”列,这些列现在将保持空白。你知道吗

一旦1月1日结束,它将从2000年1月2日重新开始。我知道,这些柱子会非常长。我需要这种方式上传到一个数据库,而不是难以置信的长行。你知道吗

所有这些都将写入一个新的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

以此类推。你知道吗


Tags: 文件csvto数据pandasdfoutputdate
2条回答

获取所需内容的最简单方法是将日期设置为索引,并使用.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]
# 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)

相关问题 更多 >