【问题标题】:Exploding pandas dataframe by list to multiple rows with a new column for multiindex将 pandas 数据帧按列表分解为多行,并为多索引添加一个新列
【发布时间】:2021-07-04 22:07:00
【问题描述】:

我有一个 Pandas 数据框,其中的列是“月”和“年”,还有一个“value_list”,它是一个值列表 - 每个月的每一天都有一个。像这样 -

year month value_list
1990 2 [10, 20, 30, 40, ...... 290, 300]
1990 3 [110, 120, 130, 140, ...... 390, 400]

我想将它们解压成多行 - 每天一个(新列),这样我就会得到如下内容 -

year month day value
1990 2 1 10
1990 2 2 20
1990 2 3 30
1990 2 4 40

等等。

我尝试使用 df.explode() 但无济于事,因为索引被重置或设置为新的单个索引。如何在解压列表时自动获取日期(本质上是创建年、月、日期多索引)?

【问题讨论】:

  • 如果df['value_list'] 是真实列表,df.explode('value_list') 应该可以工作。如果不起作用,请尝试 df['value_list']=df['value_list'].str.strip('[]').str.split(',') 后跟 df.explode('value_list')
  • 抱歉,如果我不是很清楚。 df.explode 确实有助于爆炸/拆包,但是我无法获得所有爆炸行在新列(天)中具有不同值的第二部分。我所拥有的是一份真实的清单,但我明白你的意思——谢谢!
  • 好的,你说清楚了,已经有解决方案了。继续编码

标签: python pandas dataframe multi-index


【解决方案1】:

explode 之后,您可以使用groupby-transformcumcount 创建day 序列:

df = df.explode('value_list').rename(columns={'value_list': 'value'})
df['day'] = df.groupby(['year', 'month']).transform('cumcount').add(1)

#    year  month value  day
# 0  1990      2    10    1
# 0  1990      2    20    2
# 0  1990      2    30    3
# 0  1990      2    40    4
# 0  1990      2   290    5
# 0  1990      2   300    6
# 1  1990      3   110    1
# 1  1990      3   120    2
# 1  1990      3   130    3
# 1  1990      3   140    4
# 1  1990      3   390    5
# 1  1990      3   400    6

正如@wwnde 评论的那样,如果value_list 不包含真正的列表,而只是看起来像列表的字符串,请在爆炸之前将它们转换为列表:

df.value_list = df.value_list.str.strip('[]').str.split(r'\s*,\s*')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 2019-08-17
    • 2020-12-13
    • 2021-02-21
    • 2013-04-11
    • 2022-12-17
    • 2017-03-25
    相关资源
    最近更新 更多