如何为多列

时间:2017-08-15 15:36:44

标签: python pandas dataframe

我的数据框中有一个列有价格数据但是将它们全部放在一起作为“价格x尺寸(num_orders)”。例如,列(从CSV文件中读入)是: 127.3 x 13(1) 我偶然发现了Pandas提取方法,但我只能创建一个列和一个时间。所以我有它的工作,但我想知道如何在一个声明中完成所有这一切,因为我认为它至少会给我一些Pandas指令。 这有效:

df['price']=df.Level1.str.extract('(\d*\.\d*) x', expand=False)
df['size']=df.Level1.str.extract(' x (\d*)', expand=False)
df['num_orders'] = df.Level1.str.extract(' \((\d*)\)$', expand=False)

但这不是:

gcq7['price'], gcq7['size'], gcq7['num_orders'] = 
gcq7.Level1.str.extract('(?P<price>\d*\.\d*) x (?P<size>\d*) \((?P<num_orders>\d*)\)$', expand=False)

我只是得到三个标题正确的列(价格,大小,num_orders),但它们的列名一直是值,即'price'列的“price”作为每行的值。< / p>

帮助表示赞赏。

编辑: 考虑以下列,索引为输入:

Date_Timestamp
2017-06-01 00:00:00.000      127.06000000 x 8 (0)
2017-06-01 00:00:00.000      127.38000000 x 8 (0)

期望的输出:

                              price     size    num_orders
Date_Timestamp          
2017-06-01 00:00:00.000     127.06000000    8   0
2017-06-01 00:00:00.000     127.38000000    8   0

根据建议进行编辑,以及将来的清晰度。

2 个答案:

答案 0 :(得分:1)

IIUC你几乎在那里:

pat = r'(?P<price>\d*\.\d*)\s*x\s*(?P<size>\d*)\s*\((?P<num_orders>\d*)\)$'
gcq7[['price','size','num_orders']] = gcq7.Level1.str.extract(pat, expand=True)
# NOTE:                                                                   ^^^^

答案 1 :(得分:0)

您可以使用extractall

考虑这个df:

gcq7 = pd.DataFrame({'Level1': ['127.3 x 13 (1)']})

gcq7.Level1.str.extractall('(?P<price>.*) x (?P<size>\d*) \((?P<num_orders>\d*)\)')\
.reset_index(drop=True)

你得到了

    price   size    num_orders
0   127.3   13      1