【发布时间】:2020-08-07 09:46:10
【问题描述】:
我正在尝试将具有 r 行和 c 列的非常宽的 csv 文件转换为具有 r*c 行和三列形式 row_id、col_name、col_value 的 dict 或数据帧。由于列数非常大(超过 10,000 列),因此无法手动完成。
例如,我从 pandas 数据框开始:
import pandas as pd
df = pd.DataFrame({'id': {0: '1', 1: '2', 2: '3'},
'c1': {0: 'S', 1: 'S', 2: 'D'},
'c2': {0: 'XX', 1: 'WX', 2: 'WX'},
'c3': {0: '32', 1: '63', 2: '32'}})
df = df.set_index('id')
看起来像这样:
id c1 c2 c3
0 1 S XX 32
1 2 S WX 63
2 3 D WX 32
请记住,此示例数据框只有三列,但解决方案需要处理大量列。
目标是将其转换为如下所示的字典或数据框:
id key value
0 1 c1 S
1 1 c2 XX
2 1 c3 32
3 2 c1 S
4 2 c2 WX
5 2 c3 63
6 3 c1 D
7 3 c2 WX
8 3 c3 32
我已经编写了一些实现所需输出的东西,方法是按列和行从数据帧迭代到一个新的数据帧:
data = []
for i, row in df.iterrows():
for j, column in row.iteritems():
a_dictionary = i, j, column
data.append(a_dictionary)
df_out = pd.DataFrame(data)
df_out.columns = ['id', 'key', 'value']
但我读过一篇文章,应该避免在 pandas 和 python 中使用 for 循环。那么合适的解决方案应该是什么样的呢?
【问题讨论】: