我有一个DataFrame,有1mln行和两列TypeName,它们的值是一个具有非唯一值的列表.TypeName列具有相同数量的元素,因为它们形成一对(TypeName).我想添加到我的DataFrame列中,这些列的名称是来自Type列的唯一类型,值是来自Name列的相应值的列表.下面是当前代码的一个简短示例.当行数为1mln时,它工作得很慢,所以我正在寻找一个更快的解决方案.

import pandas as pd
df = pd.DataFrame({"Type": [["1", "1", "2", "3"], ["2","3"]], "Name": [["A", "B", "C", "D"], ["E", "F"]]})

unique = list(set(df["Type"].explode()))
for t in unique:
    df[t] = None
    df[t] = df[t].astype('object')

for idx, row in df.iterrows():
    for t in unique:
        df.at[idx, t] = [row["Name"][i] for i in range(len(row["Name"])) if row["Type"][i] == t]

My desired result is: enter image description here

推荐答案

您可以分解整个数据帧,然后使用分解后的数据帧并以list作为aggfunc对其进行透视(重置索引以使用索引作为透视的分组)

df.explode(column=['Type','Name']).reset_index().pivot_table(index='index',columns='Type', values='Name',aggfunc=list)

Type    1       2   3
index           
0       [A, B]  [C] [D]
1       NaN     [E] [F]

然后把它粘回到原稿上

pd.concat([df,df.explode(column=['Type','Name']).reset_index().pivot_table(index='index',columns='Type', values='Name',aggfunc=list)],axis=1)

    Type            Name            1       2   3
0   [1, 1, 2, 3]    [A, B, C, D]    [A, B]  [C] [D]
1   [2, 3]          [E, F]          NaN     [E] [F]

根据要求,以下是为调试目的而分步编写的代码

df1=df.explode(column=['Type','Name'])
df1=df1.reset_index()
pvt=df1.pivot_table(index='index',columns='Type', values='Name',aggfunc=list)
pd.concat([df,pvt],axis=1)

Python相关问答推荐

时间序列分解

在Python中处理大量CSV文件中的数据

如何让剧作家等待Python中出现特定cookie(然后返回它)?

标题:如何在Python中使用嵌套饼图可视化分层数据?

对于一个给定的数字,找出一个整数的最小和最大可能的和

用Python解密Java加密文件

try 将一行连接到Tensorflow中的矩阵

在极性中创建条件累积和

导入...从...混乱

如果满足某些条件,则用另一个数据帧列中的值填充空数据帧或数组

如何防止Pandas将索引标为周期?

如何使用加速广播主进程张量?

在第一次调用时使用不同行为的re. sub的最佳方式

TypeError:';Locator';对象无法在PlayWriter中使用.first()调用

对于数组中的所有元素,Pandas SELECT行都具有值

在聚合中使用python-polars时如何计算模式

按列表分组到新列中

如何在Polars中将列表中的新列添加到现有的数据帧中?

了解如何让库认识到我具有所需的依赖项

使用元组扩展字典的产品挑战