使用 pandas DataFrame.explode() 后如何创建新的“索引”列?

Posted

技术标签:

【中文标题】使用 pandas DataFrame.explode() 后如何创建新的“索引”列?【英文标题】:How to create a new 'index' column after using pandas DataFrame.explode()? 【发布时间】:2021-08-21 22:33:39 【问题描述】:

我正在使用 DataFrame.explode() 取消嵌套一列列表,以便每个元素都有自己的行。我想知道的是如何创建一个新的“索引”列,该列将对应于原始列表中元素的索引。在示例中,我将此列称为“循环”。

我希望在下面附上我正在努力实现的目标的图片。如果已经有这个页面,请分享。谢谢!

【问题讨论】:

【参考方案1】:

explode之后使用groupby cumcount

df = df.explode('value').reset_index(drop=True)
df['cycle'] = df.groupby('sample').cumcount()  # Enumerate Groups
df = df[['sample', 'cycle', 'value']]  # Reorder columns

insert:

df = df.explode('value').reset_index(drop=True)
df.insert(1, 'cycle', df.groupby('sample').cumcount())  # Insert New Column

assign:

df = (
    df.explode('value')
        .assign(cycle=lambda x: x.groupby(level=0).cumcount())
        .reset_index(drop=True)[['sample', 'cycle', 'value']]
)

df:

   sample  cycle value
0       A      0     2
1       A      1     3
2       A      2     5
3       A      3     2
4       A      4     3
5       A      5     6
6       A      6     8
7       B      0    97
8       B      1    83
9       B      2     5
10      C      0   2.5
11      C      1     6
12      C      2     7
13      C      3     9

【讨论】:

非常感谢!第一种方法对我有用。我的数据比我提供的示例要复杂一些,但基本上我所要做的就是添加另一列:即df.groupby(['col1', 'col2']).cumcount()

以上是关于使用 pandas DataFrame.explode() 后如何创建新的“索引”列?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我使用 modin.pandas 比使用 Pandas 需要更长的时间 [ray]

为啥使用numpy和pandas来进行数据处理?

Pandas的使用---Pandas的数据结构

pandas报错:KeyError:

python 使用pandas #pandas导入csv

pandas使用字典列表创建dataframe(list of dictionaries)pandas使用字典数据创建dataframe(dictionary)