Как создать столбцы из строк с заданной парой ключ: значение в столбце в pandas? - PullRequest
1 голос
/ 12 июля 2020

У меня есть DF такого типа:

pd.DataFrame({'label':['A','test1: A','test2: A','B','test1: B','test3: B'],
             'value': [1,2,3,4,5,6]})

      label  value
0         A      1
1  test1: A      2
2  test2: A      3
3         B      4
4  test1: B      5
5  test3: B      6

И мне нужно преобразовать в это:

pd.DataFrame({'label':['A','B'],
             'value': [1,4],
             'test1:':[2,5],
             'test2:':[3,None],
             'test3:':[None,6]})

  label  value  test1:  test2:  test3:
0     A      1       2     3.0     NaN
1     B      4       5     NaN     6.0

Мне нужно сохранить метку для уникального значения, и ключи объединены в право, если оно присутствует в данных. Ключи могут различаться и иметь разные имена для одного значения.

Не стесняйтесь рассказать, как переименовать вопрос, потому что я не смог найти лучший способ назвать проблему.

РЕДАКТИРОВАТЬ: частично это решение содержит то, что мне нужно, однако нет достойного способа добавить столбцы, представляющие ключ в столбце метки. В идеале нужно что-то вроде функции с вводом df.

Ответы [ 2 ]

1 голос
/ 12 июля 2020

Извлечь информацию в два фрейма данных и объединить их.

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
1 голос
/ 12 июля 2020

Вот способ сделать это:

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
...