从单元格中提取列标题并相应地重新排列列

时间:2018-06-01 15:36:46

标签: python pandas csv data-manipulation

我有(大致)以下格式的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中完成它,因为我确实有一些先前的经验,并且可能能够更快地找到我的方法。但是,由于最终数据集可能包含数百万行,我当然可以采用任何其他方式来更有效地处理数据。

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

1 个答案:

答案 0 :(得分:0)

您可以使用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