首页 > 解决方案 > 从单元格中提取列标题并相应地重新排列列

问题描述

我有一个(大致)以下格式的 CSV 文件:

Day   |  Asset Allocation     
0     |  NYSE:100+++FTSE100:143+++DAX30:94
1     |  NYSE:103+++FTSE97:143+++DAX30:95
2     |  NYSE:102+++DAX30:97
3     |  NYSE:102+++DAX30:97+++STOXX:102

因此,所有资产都汇总在一列中,并用“+++”分隔。列中资产的顺序可以随着 CSV 文件的进行而改变。我想将数据重新排列为以下格式:

Day  |  NYSE  | FTSE  |  DAX  |  STOXX
0    |  100   | 143   | 94    |  0
1    |  103   | 143   | 95    |  0
2    |  102   | 0     | 97    |  0
3    |  102   | 0     | 97    |  102

最好,我希望能够在 Python 中做到这一点,因为我确实有一些先前的经验,并且可能能够更快地找到我的方法。但是,由于最终数据集可能包含数百万行,我当然愿意采用任何其他可以更有效地处理数据的方式。

如果有人能指出我正确的方向,我将不胜感激。谢谢!

标签: pythonpandascsvdata-manipulation

解决方案


您可以使用pandas.

此示例使用str.split和正则表达式来应用必要的格式。

import pandas as pd
import re

def formatter(t):
    return re.sub('[0-9]','', t[0]), int(t[1])

def converter(x):
    return dict(formatter(i.split(':')) for i in x.split('+++'))

# read file
df = pd.read_csv('file.csv', sep='|')

# apply manipulations
res = df[['Day']].join(df['Asset Allocation'].apply(converter).apply(pd.Series))\
                 .fillna(0).astype(int)

print(res)

   Day  DAX  FTSE  NYSE  STOXX
0    0   94   143   100      0
1    1   95   143   103      0
2    2   97     0   102      0
3    3   97     0   102    102

推荐阅读