Python - 将日期:价格列表转换为新行
我想把下面这个表格中的一列转换成新的行:
编号 | 价格 |
---|---|
001 | ["三月:59", "四月:64", "五月:62"] |
002 | ["一月:55", 其他] |
想要变成这样:
编号 | 日期 | 价格 |
---|---|---|
001 | 三月 | 59 |
001 | 四月 | 64 |
001 | 五月 | 62 |
002 | 一月 | 55 |
这些日期和价格的配对并不是用传统的字典格式存储的,像下面这个解决方案:
我已经把键值对分成了单独的行,像这样:
编号 | 价格 |
---|---|
001 | 三月:59 |
001 | 四月:64 |
然后我可以用字符串处理把这些分成两列,但这样感觉效率不高,没能真正利用这些键值对。有没有人能帮帮我呢?
2 个回答
2
试试这个:
# apply ast.literal_eval if necessary:
from ast import literal_eval
df["Prices"] = df["Prices"].apply(literal_eval)
df = df.explode("Prices")
df[["date", "price"]] = df.pop("Prices").str.split(":", n=1, regex=False).to_list()
print(df)
输出结果是:
Id date price
0 1 March 59
0 1 April 64
0 1 May 62
1 2 Jan 55
3
df = pd.DataFrame({'Id': ['001', '002'],
'Prices': [["March:59", "April:64", "May:62"], ["Jan:55"]]})
out = df.explode('Prices')
out[['date', 'price']] = out.pop('Prices').str.split(':', expand=True)
如果你有字符串,可以使用str.extractall
配合正则表达式,以及join
:
df = pd.DataFrame({'Id': ['001', '002'],
'Prices': ['["March:59", "April:64", "May:62"]', '["Jan:55"]']})
out = (df.drop(columns='Prices')
.join(df['Prices'].str.extractall(r'(?P<date>[^":]+):(?P<price>[^":]+)')
.droplevel('match'))
)
输出结果:
Id date price
0 001 March 59
0 001 April 64
0 001 May 62
1 002 Jan 55
这是第二种方法的正则表达式演示。