Python 如何从pandas列中给定key:value对的行创建列?

Python 如何从pandas列中给定key:value对的行创建列?,python,pandas,transpose,Python,Pandas,Transpose,我有这种DF: pd.DataFrame({'label':['A','test1:A','test2:A','B','test1:B','test3:B'], “值”:[1,2,3,4,5,6]}) 标签值 0 A 1 1测试1:A测试2 测试2:A 3 3 B 4 4测试1:B5 5测试3:B6 我需要转换成这样: pd.DataFrame({'label':['A','B'], “值”:[1,4], “test1:”:[2,5], “test2:”:[3,无], 'test3:':[No

我有这种DF:

pd.DataFrame({'label':['A','test1:A','test2:A','B','test1:B','test3:B'],
“值”:[1,2,3,4,5,6]})
标签值
0 A 1
1测试1:A测试2
测试2:A 3
3 B 4
4测试1:B5
5测试3:B6
我需要转换成这样:

pd.DataFrame({'label':['A','B'],
“值”:[1,4],
“test1:”:[2,5],
“test2:”:[3,无],
'test3:':[None,6]})
标签值test1:test2:test3:
0A123.0NAN
1 B 4 5 NaN 6.0
我需要为唯一值保留标签,如果数据中存在键,则将键合并到右侧。对于一个值,键可能会有所不同,并且具有不同的名称

请随意分享如何重命名问题,因为我找不到更好的方法来命名问题

编辑:
部分包含我需要的内容,但是没有合适的方法在label列中添加表示键的列。理想情况下,需要一个类似df输入的函数。

这里有一种方法:

df.loc[~df.label.str.contains(":"), "label"] = df.loc[~df.label.str.contains(":"), "label"].str.replace(r"(^.*$)", r"value:\1")
labels = df.label.str.split(":", expand = True).rename(columns = {0: "label1", 1:"label2"})
df = pd.concat([df, labels], axis=1)
df = pd.pivot_table(df, index="label2", columns="label1", dropna=False)
df.columns = [c[1] for c in df.columns]
df.index.name = "label"
输出为:

       test1  test2  test3  value
label                            
A        2.0    3.0    NaN    1.0
B        5.0    NaN    6.0    4.0

将信息提取到两个数据帧中并合并它们

df2 = df[df['label'].str.contains('test')]
df3 = df2['label'].str.split(expand=True).rename(columns={0: "test", 1: "label"})
df3['value'] = df2['value']
df3 = df3.pivot_table(index='label', columns='test', values='value')
df2 = df[~df['label'].str.contains('test')]
df4 = pd.merge(df2, df3, on='label')
输出

  label  value  test1:  test2:  test3:
0     A      1     2.0     3.0     NaN
1     B      4     5.0     NaN     6.0

“到目前为止你都试了些什么?”SurajSubramanian说,真的没什么效果。但是,考虑了使用apply的lambda函数,却不知道如何构造结果:(这回答了你的问题吗?@NelsonGon你提供的链接与我的问题基本相同,但它使用for循环来命名和创建新列,这在数据量较大的情况下效率不高。我通常会链接重复项,以便查看它是否解决了问题。不会撤回。请随意添加你的评论。)r问题,所以其他人知道为什么这可能不适用于您。我对下面连接的val列有一点不同。另外,您知道如何删除label1,label2吗?您的解决方案中有一些事实:)稍微改进-更改列名以删除额外级别。请参阅编辑。这些都有意义,但是,在数据透视中会产生一些不同的输出,我认为这完全有意义,并避免了循环。谢谢!@sumixam.contains很可能是一个循环,pivot_table方法也是如此