Как я могу развернуть и реструктурировать мой извилистый фрейм данных так, чтобы все пары ключ-значение во всех строках были готовы для помещения в БД? - PullRequest
0 голосов
/ 12 октября 2019

В настоящее время у меня есть CSV-файл, который выглядит следующим образом:

id key1   value1 key2    value2   key3   value3  key4        value4
0  Colour Blue   Shape   Square   Price  3 
1  Age    4      Colour  Red      Price  5       Condition   New

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

id Colour Shape   Price    Age    Condition
0  Blue   Square  3        NULL   NULL
1  Red    NULL    5        4      New

Конечной целью было бы отформатировать его, чтобы его можно было импортировать в виде таблицы в базе данных MySQL.

Ответы [ 2 ]

1 голос
/ 12 октября 2019

Вы можете использовать это

df1 = df.filter(like='key').stack().reset_index().rename(columns={'level_0':'id','level_1':'keys',0:'key_val'})

df2 = df.filter(like='value').stack().reset_index().rename(columns={'level_0':'id','level_1':'valnum',0:'val'})

(df1.merge(df2,on ='id',how='outer', left_index=True, right_index=True).pivot('id','key_val','val')
 .reset_index()
 .rename_axis(None, axis=1)
 .drop('None',axis=1))

Выход

    id  Age     Colour  Condition   Price   Shape
0   0   NaN     Blue    NaN            3    Square
1   1   4       Red     New            5    NaN
0 голосов
/ 12 октября 2019

Я предпочитаю решение @moys, но в любом случае это мое.

# get every key-value column pair
cols_zipped = [*zip(df.columns,df.columns[1:])][::2]

# create single key-value column pair
df_lst = []
for _ in cols_zipped:
    df_ = df.loc[:,[*_]]
    df_.rename({_[0]:'key', _[1]:'value'}, axis=1, inplace=True)
    df_lst.append(df_)
df_concat = pd.concat(df_lst)

# groupby key, apply list to values, and convert to a dictionary
key_dct = df_concat.groupby('key')['value'].apply(list).to_dict()

# create new dataframe
pd.DataFrame.from_dict(key_dct, orient='index').T
...