如何将DataFrame列名与对应列表值映射生成规整新DataFrame
如何将包含列表的DataFrame转换为列名对应值的宽表?
我的原始DataFrame结构:
| Column_Name | Values |
|---|---|
| X | [1, 2, 3] |
| Y | [a, b, c] |
| Z | [20-09-2020, 20-12-2202, 1-1-2001] |
| W | [0.1, 0.2, 0.3] |
数据类型输出:
df.dtypes # Values object # column_name object # dtype: object
期望得到的新DataFrame结构:
| X | Y | Z | W | |
|---|---|---|---|---|
| 0 | 1 | a | 20-09-2020 | 0.1 |
| 1 | 2 | b | 20-12-2202 | 0.2 |
| 2 | 3 | c | 1-1-2001 | 0.3 |
已完成的前置代码:
df_all = pd.read_sql_table('Test',engine) df_test = pd.Series({c:df_all[c].unique() for c in df_all}) df = pd.DataFrame({'column_name': df_test.index,'Values':df_test.values}) df.reset_index(drop=True,inplace=True)
解决方案
嘿,你已经完成了最核心的前置步骤,现在只需要把这些列表展开并映射到对应的列就行啦,给你两种实用的方法:
方法一:简洁直接的字典转换
因为你的column_name刚好是我们要的新列名,Values里的列表就是每列对应的值,直接把它们打包成字典传给pd.DataFrame就行:
new_df = pd.DataFrame(dict(zip(df['column_name'], df['Values'])))
一行代码搞定,非常高效。
方法二:分步拆解更易理解
如果想清楚看到每一步的转换过程,可以用explode先把列表拆成多行,再透视成宽表:
# 1. 把Values里的每个元素拆成单独的行,保留对应的列名 df_exploded = df.explode('Values') # 2. 给每个列名下的元素添加行号,用来对齐后续的透视 df_exploded['row_id'] = df_exploded.groupby('column_name').cumcount() # 3. 透视生成宽表,最后清理一下列名层级 new_df = df_exploded.pivot(index='row_id', columns='column_name', values='Values').reset_index(drop=True) new_df.columns.name = None
两种方法都能得到你想要的结果,选哪种看你更偏向简洁还是过程可视化啦。
内容的提问来源于stack exchange,提问作者Vdoo
相关产品推荐
相关产品推荐

