Python - 将日期:价格列表转换为新行

2 投票
2 回答
49 浏览
提问于 2025-04-12 16:34

我想把下面这个表格中的一列转换成新的行:

编号 价格
001 ["三月:59", "四月:64", "五月:62"]
002 ["一月:55", 其他]

想要变成这样:

编号 日期 价格
001 三月 59
001 四月 64
001 五月 62
002 一月 55

这些日期和价格的配对并不是用传统的字典格式存储的,像下面这个解决方案:

将字典的键转换为行,并使用Pandas在单列中显示所有值

我已经把键值对分成了单独的行,像这样:

编号 价格
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

如果你有有效的列表,可以使用explodesplit

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

这是第二种方法的正则表达式演示

撰写回答