поворотный фрейм данных с двумя столбцами списков - PullRequest
4 голосов
/ 16 мая 2019

У меня есть датафрейм вроде:

matrix = [(222, ['A','B','C'], [1,2,3]),
         (333, ['A','B','D'], [1,3,5])]

df = pd.DataFrame(matrix, columns=['timestamp', 'variable', 'value'])
timestamp     variable         value   

222           ['A','B','C']    [1,2,3]
333           ['A','B','D']    [1,3,5]

и хотел бы повернуть его, чтобы сохранить значение timestamp, уникальные значения в столбце variable становятся дополнительными столбцами, а значения из value сортируются в соответствующих столбцах.

Вывод должен выглядеть следующим образом:

timestamp   A    B    C    D 

222         1    2    3    nan
333         1    3    nan  5 

любая помощь будет принята с благодарностью! :)

Ответы [ 3 ]

3 голосов
/ 16 мая 2019

Сначала используйте unnest , затем просто pivot

unnesting(df,['variable','value']).pivot(*df.columns)
Out[79]: 
variable     A    B    C    D
timestamp                    
222        1.0  2.0  3.0  NaN
333        1.0  3.0  NaN  5.0

def unnesting(df, explode):
    idx = df.index.repeat(df[explode[0]].str.len())
    df1 = pd.concat([
        pd.DataFrame({x: np.concatenate(df[x].values)}) for x in explode], axis=1)
    df1.index = idx

    return df1.join(df.drop(explode, 1), how='left')
3 голосов
/ 16 мая 2019

Создать словарь с zip, передать в DataFrame конструктор:

a = [dict(zip(*x)) for x in zip(df['variable'], df['value'])]
print (a)
[{'A': 1, 'B': 2, 'C': 3}, {'A': 1, 'B': 3, 'D': 5}]

df = df[['timestamp']].join(pd.DataFrame(a, index=df.index))
print (df)
   timestamp  A  B    C    D
0        222  1  2  3.0  NaN
1        333  1  3  NaN  5.0

Если во многих других столбцах используется DataFrame.pop для извлечения столбцов:

a = [dict(zip(*x)) for x in zip(df.pop('variable'), df.pop('value'))]

df = df.join(pd.DataFrame(a, index=df.index))
print (df)
   timestamp  A  B    C    D
0        222  1  2  3.0  NaN
1        333  1  3  NaN  5.0
2 голосов
/ 16 мая 2019

Вы можете передавать значения и имена столбцов в конструктор pd.Series. Это автоматически расширит значения в нужной вам форме.

df.set_index('timestamp').apply(lambda row: pd.Series(row.value, index=row.variable), axis=1)

# outputs:
             A    B    C    D
timestamp
222        1.0  2.0  3.0  NaN
333        1.0  3.0  NaN  5.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...