如何根据作为值列表的列值扩展熊猫数据框[重复]

Posted

技术标签:

【中文标题】如何根据作为值列表的列值扩展熊猫数据框[重复]【英文标题】:how to expand pandas dataframe based on column value which is list of values [duplicate] 【发布时间】:2021-12-20 13:55:22 【问题描述】:

我有这样的数据框:

Col1    col2     col3
test0   [1,2,3]  [ab,bc,cd]

我想要的输出数据框是:

col1   col2  col3
test0  1      ab
test0  2      bc
test0  3      cd

会有多个列,如 col2,列表长度相同

【问题讨论】:

看看explode 【参考方案1】:

你可以这样做:

outputdf_expandedcols=pd.DataFrame(
    "col2":df.apply(lambda x: pd.Series(x['col2']),axis=1).stack().reset_index(level=1, drop=True),
    "col3":df.apply(lambda x: pd.Series(x['col3']),axis=1).stack().reset_index(level=1, drop=True)
)

outputdf = df[['Col1']].join(outputdf_expandedcols,how='right')    

outputdf 将是:

    Col1  col2 col3
0  test0     1   ab
0  test0     2   bc
0  test0     3   cd

如果您有更多列要扩展,您可以使用dict comprehension:

list_of_cols_to_expand = ["col2", "col3"] # put here the column names you want to expand
outputdf_expandedcols=pd.DataFrame(
    col:df.apply(lambda x: pd.Series(x[col]),axis=1).stack().reset_index(level=1, drop=True) for col in list_of_cols_to_expand
)

outputdf = df[['Col1']].join(outputdf_expandedcols,how='right')

输出同上。

此答案基于this 线程。

【讨论】:

它是否适用于更新后的示例?基本上 col2 中的 1 与 col 3 中的 ab 映射等等.. 现在可以了,是的。 你也有 col4,与 col2 和 col3 的设置相同吗?【参考方案2】:

如果你有最新版本的 pandas,你也可以这样做:

cols_to_expand = ["col2", "col3"] # or more columns if you have more
outputdf = df.explode(cols_to_expand)

outputdf 将是:

    Col1 col2 col3
0  test0    1   ab
0  test0    2   bc
0  test0    3   cd

要在 Google Colab 中拥有兼容的 Pandas 版本,您需要运行一个单元格(基于 this):

%%shell
pip install --upgrade --force-reinstall pandas
pip install -I pandas
pip install --ignore-installed pandas

然后重启内核(点击Runtime,然后点击Restart runtime)。

【讨论】:

以上是关于如何根据作为值列表的列值扩展熊猫数据框[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在python中过滤与列表值匹配的列值的数据框[重复]

查找作为列表存在的列元素的数据框索引的最快方法

如何将熊猫系列的列值转换为Python中的列表?

根据包含列表元素的列值创建布尔标志[重复]

如何根据数据框中的列值获取特定的行数[重复]

确定熊猫数据框中的列值何时更改